purebasic.info

PureBasic forum
Текущее время: Чт ноя 15, 2018 12:57 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 9:10 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
А вообще, если есть заморочки с длинными именами файлов, то беспроигрышный вариант - это преобразование их в "короткие" по схеме (8.3) Вот вам волшебные процедуры преобразования:

Код:
1
2
3
4
5
6
Procedure.s GetShortFileName ( Long.s ) 
  Short.s = Long
  GetShortPathName_ ( @Long, @Short, Len(Short) )
  ProcedureReturn Short
EndProcedure
 



И обратно из короткого в длинное :
Код:
1
2
3
4
5
6
7
8
 
Procedure.s GetLongFileName ( Short.s )
  Res = FindFirstFile_ ( @Short, FD.WIN32_FIND_DATA )
  If Res
    ProcedureReturn PeekS( @FD\cFileName[0], 255)
  EndIf
  ProcedureReturn ""
EndProcedure



Правда, не знаю, поможет ли это в конкретном примере, но в общем случае помогает :D

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 9:13 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1706
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
не поможет :) у тебя косяк был с реестром. вы не там копаете товарищи :))) она в программу получить не может полный путь, а вы о преобразовании думаете :)
исправил - см. 2 поста назад.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 9:20 pm 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
SereZa писал(а):
вобщем как сказал Петр - ставь кавычки и будет тебе щастье :)

Код:
1
2
 
ProcedureReturn RegCreateKeyValue("HKEY_CLASSES_ROOT\*\Shell"+MenuCommand+"\command","",Chr(34)+ProgrammCommand+Chr(34)+" "+Chr(34)+"%1"+Chr(34),#REG_SZ,".")



Да все работает!!!!!!!!!!!!!!!!!
Только я пока не понял как. Полез разбираться, пока мозги не сотру начисто, не брошу :D Если понадобится весь гугл с яндексом задолбаю, благо безлимит у меня. :D
Спасибо, что помогли


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 9:41 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
haav писал(а):
Только я пока не понял как
Так я же выше писал что кавычки нужны, а Chr(34) это и есть кавычка! :)

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 02, 2009 7:36 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Да теперь все понятно, еще раз спасибо. Хороший урок.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 02, 2009 9:11 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
haav писал(а):
SereZa писал(а):
вобщем как сказал Петр - ставь кавычки и будет тебе щастье :)

Код:
1
2
 
ProcedureReturn RegCreateKeyValue("HKEY_CLASSES_ROOT\*\Shell"+MenuCommand+"\command","",Chr(34)+ProgrammCommand+Chr(34)+" "+Chr(34)+"%1"+Chr(34),#REG_SZ,".")



Да все работает!!!!!!!!!!!!!!!!!
Только я пока не понял как. Полез разбираться, пока мозги не сотру начисто, не брошу :D Если понадобится весь гугл с яндексом задолбаю, благо безлимит у меня. :D
Спасибо, что помогли


Что то я так и не догнал, в чем была суть вопроса и чем тут кто то комуто помог, если это и есть мой исходник один в один? Старею видать...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 02, 2009 9:18 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Код:
1
+Chr(34)+"%1"+Chr(34)


Вот в этом разница.
Если убрать кавычки, то обратный путь в котором есть пробелы, не отображается правильно, то есть отрезается все после первого пробела. Например:
C:\Documents and Settings вернет только C:\Documents


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 02, 2009 1:19 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
haav писал(а):
Вот в этом разница.


Ага, увидел! :D
Точно старею, нет ни какой внимательности!
Надо поправить исходник первого поста....

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 25, 2010 8:09 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Уже не один раз брался за контекстное меню, не получалось бросал.
Вчера опять нахлынуло. Создал правда больно коряво и примитивно передачу нескольких параметров через контекстное меню.
Суть такова:

Параметры передаются программе A, она пишет их в текстовый файл и открывает программу B, которая потом считывает этот тектовый файл и удаляет его. Программа B проверяет свой запуск и не дает запускаться второй копии.

Может есть другой путь, менее извращенный?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 25, 2010 9:13 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
я не знаю в тему ли это будет для тебя, но когда нужно было что-то передать другой программе (при условии что программы А и В обе твои и передаваемые данные не очень большие), я запускал вторую программу с параметрами, ну и естественно в параметрах все необходимое писал:

Код:
1
RunProgram("\путь"+"B.exe" ,"параметры1 параметры2 ... ","\путь")



а когда второй программе требовалось передать много данных в первую, то перед запуском B.exe из А.exe, в А.exe создавал Pipe, а программа B.exe записывала данные в этот Pipe.
ИТОГО:
создание в А.exe:
Код:
1
hPipe1=CreateNamedPipe_("\\.\pipe\namepipe", #PIPE_ACCESS_DUPLEX, #PIPE_TYPE_MESSAGE | #PIPE_READMODE_MESSAGE, 1, 2048, 2048, 3000, #Null) 



запись данных программой B.exe в Pipe:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
Procedure PosilkaPipe(msg.s)
bufWrite.s = Space(8096)
  If WaitNamedPipe_("\\.\pipe\namepipe", #NMPWAIT_WAIT_FOREVER)<>0
      hPipe  = CreateFile_("\\.\pipe\namepipe", #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING,0, #Null)
      If hPipe<>0
        bufWrite = msg
        WriteFile_(hPipe, @bufWrite, Len(bufWrite), @wbytes, 0)
        FlushFileBuffers_(hPipe)
        CloseHandle_(hPipe)
      EndIf
  EndIf
EndProcedure



чтение программой А.exe из Pipe:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure PriemPipe(hPipe)
bufRead.s= Space(8096)
      pcf=ConnectNamedPipe_(hPipe, #Null)
        If pcf<>0
          ReadFile_(hPipe, @bufRead, Len(bufRead), @rbytes.l, 0)
             ChisloFunc=CountString(bufRead, Chr(10))
               MestoMassiv=0
               For x=2 To ChisloFunc
                  ReDim BazaSpisokFunkciyPriemPipe(MestoMassiv)
                  BazaSpisokFunkciyPriemPipe(MestoMassiv)=StringField(bufRead, x, Chr(10))
                  MestoMassiv+1
               Next
          DisconnectNamedPipe_(hPipe)
        EndIf
CloseHandle_(hPipe)      
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 25, 2010 10:07 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
передаваемые данные не очень большие


Пути к файлам, передаваемые через реестр и коммандную строку.

Спасибо за примеры.
Из меня кодер то еще сырой и заморачиваться с серверами пока не под силу. Я хочу сделать контекстное меню как у Winrar или Winamp. Как там передается много параметров так быстро, ума не приложу. :(
Но догадываюсь, что не так как у меня.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 24, 2010 12:01 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Как-бы ещё "прикрутить" иконку к создаваемому пункту меню?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 24, 2010 8:53 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Пётр писал(а):
Как-бы ещё "прикрутить" иконку к создаваемому пункту меню?

Можно изучить ветку реестра HKEY_CLASSES_ROOT на предмет того, как это делает WINRAR. Но видимо придется создавать идентификатор типа HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\{a2a9545d-a0c2-42b4-9708-a0b2badd77c8}

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 24, 2010 6:50 pm 
Не в сети
док

Зарегистрирован: Вс май 02, 2010 4:54 pm
Сообщений: 117
Откуда: оттуда...
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
@Пётр
Если покороче, то это возможно сделать через добавление пути к иконке в параметре реестра, но эта фишка работает только начиная с win7...

В Хрюше и Свисте нужно писать *.DLL-ку, но не простую, а COM-понентную :twisted:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 24, 2010 7:06 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Sp01LeR писал(а):
Если покороче, то это возможно сделать через добавление пути к иконке в параметре реестра, но эта фишка работает только начиная с win7

Ага, а как же другие проги (тот же WinRAR) это делают?

Sp01LeR писал(а):
В Хрюше и Свисте нужно писать *.DLL-ку, но не простую, а COM-понентную

Вот реализация этого на пурике http://purebasic.mybb.ru/viewtopic.php?id=39
Правда, после удаления регистрации ее, она чего-то продолжает висеть в процессах.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 73 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB