Страница 1 из 1

Передача параметров программе

Добавлено: 08 май 2005, 20:15
alex_samus
Люди , помогите если кто знает.Мне нужно , чтобы при нажатии строки в контекстном меню , файл запускался в моей программе , но мне нужно получить пути к выделенным файлам . Если файл один , то путь к нему передается как параметр, а вот как получить пути к нескольким файлам?Ниже преведен мой код создания строки в контекстном меню для моего расширения. Если я открываю несколько файлов , то открывается несколько моих программ и каждой передается один путь.

Код: Выделить всё

var 
  reg: TRegistry; 
begin 
  reg := TRegistry.Create; 
  reg.RootKey := HKEY_CLASSES_ROOT; 
  reg.LazyWrite := false; 
  reg.OpenKey(edit2.Text+'\shell\open\command', true); 
  reg.WriteString('', application.ExeName+' %1'); 
  reg.CloseKey; 
  reg.OpenKey(edit2.text+'\DefaultIcon',true); 
  reg.WriteString('', application.ExeName+',0'); 
  reg.CloseKey; 
  reg.free; 
end; 
//В edit2 у меня расширение которое надо зарегистрировать  

Добавлено: 11 май 2005, 18:44
Romeo
Посмотри как это сделано для WinAmp.

Добавлено: 12 май 2005, 08:40
LAngel
А если при запуске программы проверять, запущена ли она уже, и если да - то передавать параметр (имя файла) ей. Как это сделать - временным файлом, или сообщениями WM это уже Вам решать.

Добавлено: 12 май 2005, 12:45
RoKon
LAngel, читаешь мои мысли. Такой вариант один из первых пришел в голову, но блин, че то не очень красиво как-то получается. Хотя по другому даже не знаю, можно ли через реестр обработать запуск одной копии для нескольких выделенных файлов.
Впринципе идея реализуемая, можно попробовать.

Добавлено: 12 май 2005, 22:52
Nucleus
Хватит языком молоть лучше б что ни будь "материальное" ему дали!!

пиши на мыло у меня есть исходник (если надо) там все что тебе нужно реализованно

Маил: shutterman@mail.ru

Добавлено: 12 май 2005, 23:40
RoKon
Nucleus, было бы дали, а ты считаешь что раз самому не приходилось работать с данным вопросом, то нечего и размышлять на эту тему пока самому не преспичит?

Добавлено: 19 май 2005, 01:48
Naeel Maqsudov
А если при запуске программы проверять, запущена ли она уже, и если да - то передавать параметр (имя файла) ей. Как это сделать - временным файлом, или сообщениями WM это уже Вам решать.
Эта задача разбивается на три
1) проверить запущена или нет можно с помощью семафоров, (например CreateSemaphore) Обсуждалось в этом форуме.
2) найти окно запущенного экземпляра - ну это FindWindow
3) передача блока данных определенной длины - это WM_COPYDATA - самый простой и надежный способ IPC (Inter process communacation). Экземпляр, который нашел другой запущенный эекземпляр WM_делает SendMessage(WM_COPYDATA, @Data). Другой же в своей оконной процедуре ловит событие COPYDATA.
Попробуйте! Вам понравится. Если не разберетесь - пишите.