![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать commandline
Gu © (2011-09-26 13:51:00)Вот есть например Ms.Word. Кликаем в проводнике на какойнибудь документ, он окрывается в окне ворда. Кликаем на другой он открывается в новой вкладке этого же окна. Т.е. приложение не закрывается и не новое окно открывается. Или например WMPlayer (или Windows Media player Classic - там опция есть "один проигрыватель для каждого файла") - запускаем какой нибудь avi, открывается Wmp, запускаем другой - новое воспроизведение в этом же окне.
Как это реализовать? Т.е. нужно чтобы при запуске файла, расш.которого привязано к приложению (и если приложение уже в памяти) запущеному приложению передавалась бы командная строка запуска + событие, что идет запуск нового.
QAZ (2011-09-26 19:26:00) [21]незнай как с VCL,у меня на чистом апи все норм
Rouse_ (2011-09-26 19:23:00) [22]
> QAZ (26.09.11 19:11) [17]
> то Rouse_ ,незнаю чего у вас не получилось,но оно как работало,
> так и работает и в 7ке тоже
Я сам этой проблемой не занимался, там Макс Черных и jack128 копался, но судя по их словам что-то поменялось в DDE (вполне вероятно что и в VCL-реализации сервера, но не суть, я в тонкости не вникал). Само по себе все работает, за исключением некоторых частных случаев, если интересно, то завтра могу уточнить у ребят, в SVN код должен был остаться...
QAZ (2011-09-26 19:11:00) [23]
> Что ж ты ни одного способа не озвучил? Или ты из тех, которые
> отвечающих лечат?
я просто смотрю кому зазря медали раздают :)
вот первый способ озвучили
>Rouse_ © (26.09.11 18:11) [14]
> Игорь Шевченко © (26.09.11 18:11) [15]
маладца, им медальки можно :)
а вот у
> Юрий Зотов © (26.09.11 17:56) [13]
срочно забрать ;)
то Rouse_,незнаю чего у вас не получилось,но оно как работало,так и работает и в 7ке тоже
а теперь дружно угадайте каким макаром дельфя открывает файлы...
зы
ну а второй способ логично вытекает из первого что пришло на замену DDE?
Jeer (2011-09-26 18:24:00) [24]
> А "передасть сообщение с параметром"
А ведь скажут у Jeer-a с русским плохо :)
Игорь Шевченко (2011-09-26 18:11:00) [25]
> Больше проводник не сделает ничего, сколько его ни проси.
DDE может сделать
Rouse_ (2011-09-26 18:11:00) [26]До висты мы делали через DDE, но потом начались проблемы из-за изменений в самом DDE (уже не помню точно, толи с ярлыка перестало правильно запускаться, толь из кучи файлов приходил только первый, давно было...) и перешли тоже на WM_COPYDATA.
Юрий Зотов (2011-09-26 17:56:00) [27]
> QAZ (26.09.11 16:59) [11]
> все что нужно передаст сам проводник если его попросить при
> регистрации типа файла в системе
Проводник запустит ВТОРУЮ копию программы и параметр передаст ЕЙ . Больше проводник не сделает ничего, сколько его ни проси.
Поэтому все, что нужно сделать, вторая копия должна сделать САМА , никто за нее ничего делать не будет. А сделать она должна именно то, что Вы и написали: "обнаружить уже имеющийся экземпляр и передасть ему сообщение с параметром, после чего мирно уйти в небытие".
Конечно, уведомление первой копии не обязательно делать именно в виде сообщения, можно использовать и другие механизмы. Но и сообщение - это тоже вполне нормальный способ. А вовсе не "0нальный".
> Gu
На "Королевстве" есть статья Антона Григорьева, в которой Ваша задача подробно разобрана. С объяснениями, с работающим примером и его кодом. Называется она как-то так: "Обобщающие примеры работы с WinAPI". Там три статьи с таким названием, но разных авторов - Вам нужен пример Антона.
Плохиш (2011-09-26 17:10:00) [28]
> QAZ (26.09.11 15:52) [9]
>
>
> > На делфимастере эта тема обсасывается каждые полгода.
>
> ага и каждые полгода советуют
Врать не надо, много уже и кода давалось.
> хотя ни одна из серьезных программ так не делает, а есть
> как минимум 2 вменяемых способа
Что ж ты ни одного способа не озвучил? Или ты из тех, которые отвечающих лечат?
> QAZ (26.09.11 16:59) [11]
>
>
> > Юрий Зотов © (26.09.11 16:40) [10]
>
> тем, что это 0нальный способ,все что нужно передаст сам
> проводник если его попросить при регистрации типа файла
> в системе
Кому передаст проводник?
QAZ (2011-09-26 16:59:00) [29]
> Юрий Зотов © (26.09.11 16:40) [10]
тем, что это 0нальный способ,все что нужно передаст сам проводник если его попросить при регистрации типа файла в системе
Юрий Зотов (2011-09-26 16:40:00) [30]
> QAZ (26.09.11 15:52) [9]
А "передасть сообщение с параметром" - чем плохо?
QAZ (2011-09-26 15:52:00) [31]
> На делфимастере эта тема обсасывается каждые полгода.
ага и каждые полгода советуют
> Запустить экземпляр, обнаружить уже имеющийся экземпляр
> и передасть ему сообщение с параметром, после чего мирно
> уйти в небытие.
хотя ни одна из серьезных программ так не делает, а есть как минимум 2 вменяемых способа
Dimka Maslov (2011-09-26 15:31:00) [32]Лично у меня обычно делается так.
Первый экземпляр создаёт дополнительное невидимое окно с нечленораздельным именем класса.
Все последующие экземпляры сначала ищут то самое окно. Найдя его они создают Atom с текстом командной строки, передают его окну и мирно завершают работу.
Первый экземпляр, получив такое сообщение, преобразует Atom назад в строку и принимает необходимые меры.
Можно, конечно и через маппинг, но атомами кидаться проще.
Плохиш (2011-09-26 14:39:00) [33]На делфимастере эта тема обсасывается каждые полгода.
Gu (2011-09-26 14:17:00) [34]спасибо! ща буду пробовать.
вот еще нашел через файлмаппинг: http://delphiworld.narod.ru/base/send_cmd_s_to_f.html
И. Павел (2011-09-26 14:13:00) [35]хотя вот эта ссылка лучше. Тут полнее описано:
http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm
И. Павел (2011-09-26 14:11:00) [36]> [3] Gu (26.09.11 14:08)
http://www.cyberguru.ru/programming/delphi/delphi-faq-page75.html
Gu (2011-09-26 14:08:00) [37]вот через мутексы определяю, что запускается вторая копия, а как передать командную строку?
Jeer (2011-09-26 13:57:00) [38]Запустить экземпляр, обнаружить уже имеющийся экземпляр и передасть ему сообщение с параметром, после чего мирно уйти в небытие.
И. Павел (2011-09-26 13:55:00) [39]Как вариант: программа запускается, ищет уже существующий экземпляр такой же программы и, если находит, отправляет ему сообщение с информацией о том, что нужно сделать, а сама закрывается.