Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
ВнизПередать commandline Найти похожие ветки
← →
Gu (2011-09-26 13:51) [0]Вот есть например Ms.Word. Кликаем в проводнике на какойнибудь документ, он окрывается в окне ворда. Кликаем на другой он открывается в новой вкладке этого же окна. Т.е. приложение не закрывается и не новое окно открывается. Или например WMPlayer (или Windows Media player Classic - там опция есть "один проигрыватель для каждого файла") - запускаем какой нибудь avi, открывается Wmp, запускаем другой - новое воспроизведение в этом же окне.
Как это реализовать? Т.е. нужно чтобы при запуске файла, расш.которого привязано к приложению (и если приложение уже в памяти) запущеному приложению передавалась бы командная строка запуска + событие, что идет запуск нового.
← →
И. Павел © (2011-09-26 13:55) [1]Как вариант: программа запускается, ищет уже существующий экземпляр такой же программы и, если находит, отправляет ему сообщение с информацией о том, что нужно сделать, а сама закрывается.
← →
Jeer © (2011-09-26 13:57) [2]Запустить экземпляр, обнаружить уже имеющийся экземпляр и передасть ему сообщение с параметром, после чего мирно уйти в небытие.
← →
Gu (2011-09-26 14:08) [3]вот через мутексы определяю, что запускается вторая копия, а как передать командную строку?
← →
И. Павел © (2011-09-26 14:11) [4]> [3] Gu (26.09.11 14:08)
http://www.cyberguru.ru/programming/delphi/delphi-faq-page75.html
← →
И. Павел © (2011-09-26 14:13) [5]хотя вот эта ссылка лучше. Тут полнее описано:
http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm
← →
Gu (2011-09-26 14:17) [6]спасибо! ща буду пробовать.
вот еще нашел через файлмаппинг: http://delphiworld.narod.ru/base/send_cmd_s_to_f.html
← →
Плохиш © (2011-09-26 14:39) [7]На делфимастере эта тема обсасывается каждые полгода.
← →
Dimka Maslov © (2011-09-26 15:31) [8]Лично у меня обычно делается так.
Первый экземпляр создаёт дополнительное невидимое окно с нечленораздельным именем класса.
Все последующие экземпляры сначала ищут то самое окно. Найдя его они создают Atom с текстом командной строки, передают его окну и мирно завершают работу.
Первый экземпляр, получив такое сообщение, преобразует Atom назад в строку и принимает необходимые меры.
Можно, конечно и через маппинг, но атомами кидаться проще.
← →
QAZ (2011-09-26 15:52) [9]
> На делфимастере эта тема обсасывается каждые полгода.
ага и каждые полгода советуют
> Запустить экземпляр, обнаружить уже имеющийся экземпляр
> и передасть ему сообщение с параметром, после чего мирно
> уйти в небытие.
хотя ни одна из серьезных программ так не делает, а есть как минимум 2 вменяемых способа
← →
Юрий Зотов © (2011-09-26 16:40) [10]
> QAZ (26.09.11 15:52) [9]
А "передасть сообщение с параметром" - чем плохо?
← →
QAZ (2011-09-26 16:59) [11]
> Юрий Зотов © (26.09.11 16:40) [10]
тем, что это 0нальный способ,все что нужно передаст сам проводник если его попросить при регистрации типа файла в системе
← →
Плохиш © (2011-09-26 17:10) [12]
> QAZ (26.09.11 15:52) [9]
>
>
> > На делфимастере эта тема обсасывается каждые полгода.
>
> ага и каждые полгода советуют
Врать не надо, много уже и кода давалось.
> хотя ни одна из серьезных программ так не делает, а есть
> как минимум 2 вменяемых способа
Что ж ты ни одного способа не озвучил? Или ты из тех, которые отвечающих лечат?
> QAZ (26.09.11 16:59) [11]
>
>
> > Юрий Зотов © (26.09.11 16:40) [10]
>
> тем, что это 0нальный способ,все что нужно передаст сам
> проводник если его попросить при регистрации типа файла
> в системе
Кому передаст проводник?
← →
Юрий Зотов © (2011-09-26 17:56) [13]
> QAZ (26.09.11 16:59) [11]
> все что нужно передаст сам проводник если его попросить при
> регистрации типа файла в системе
Проводник запустит ВТОРУЮ копию программы и параметр передаст ЕЙ. Больше проводник не сделает ничего, сколько его ни проси.
Поэтому все, что нужно сделать, вторая копия должна сделать САМА, никто за нее ничего делать не будет. А сделать она должна именно то, что Вы и написали: "обнаружить уже имеющийся экземпляр и передасть ему сообщение с параметром, после чего мирно уйти в небытие".
Конечно, уведомление первой копии не обязательно делать именно в виде сообщения, можно использовать и другие механизмы. Но и сообщение - это тоже вполне нормальный способ. А вовсе не "0нальный".
> Gu
На "Королевстве" есть статья Антона Григорьева, в которой Ваша задача подробно разобрана. С объяснениями, с работающим примером и его кодом. Называется она как-то так: "Обобщающие примеры работы с WinAPI". Там три статьи с таким названием, но разных авторов - Вам нужен пример Антона.
← →
Rouse_ © (2011-09-26 18:11) [14]До висты мы делали через DDE, но потом начались проблемы из-за изменений в самом DDE (уже не помню точно, толи с ярлыка перестало правильно запускаться, толь из кучи файлов приходил только первый, давно было...) и перешли тоже на WM_COPYDATA.
← →
Игорь Шевченко © (2011-09-26 18:11) [15]
> Больше проводник не сделает ничего, сколько его ни проси.
DDE может сделать
← →
Jeer © (2011-09-26 18:24) [16]
> А "передасть сообщение с параметром"
А ведь скажут у Jeer-a с русским плохо :)
← →
QAZ (2011-09-26 19:11) [17]
> Что ж ты ни одного способа не озвучил? Или ты из тех, которые
> отвечающих лечат?
я просто смотрю кому зазря медали раздают :)
вот первый способ озвучили
>Rouse_ © (26.09.11 18:11) [14]
> Игорь Шевченко © (26.09.11 18:11) [15]
маладца, им медальки можно :)
а вот у
> Юрий Зотов © (26.09.11 17:56) [13]
срочно забрать ;)
то Rouse_ ,незнаю чего у вас не получилось,но оно как работало,так и работает и в 7ке тоже
а теперь дружно угадайте каким макаром дельфя открывает файлы...
зы
ну а второй способ логично вытекает из первого что пришло на замену DDE?
← →
Rouse_ © (2011-09-26 19:23) [18]
> QAZ (26.09.11 19:11) [17]
> то Rouse_ ,незнаю чего у вас не получилось,но оно как работало,
> так и работает и в 7ке тоже
Я сам этой проблемой не занимался, там Макс Черных и jack128 копался, но судя по их словам что-то поменялось в DDE (вполне вероятно что и в VCL-реализации сервера, но не суть, я в тонкости не вникал). Само по себе все работает, за исключением некоторых частных случаев, если интересно, то завтра могу уточнить у ребят, в SVN код должен был остаться...
← →
QAZ (2011-09-26 19:26) [19]незнай как с VCL,у меня на чистом апи все норм
← →
Rouse_ © (2011-09-26 19:28) [20]Эээ - так мы не договаривались, на АПИ, таки я подозреваю, всегда работать будет :)
← →
Юрий Зотов © (2011-09-26 22:14) [21]> QAZ
Медальку можете забрать, не в ней дело. Но, может быть, Вы все же объясните, ЧЕМ же КОНКРЕТНО плох способ отсылки сообщения?
А то голословно как-то у Вас звучит... обоснование не помешало бы... ну хоть какое-нибудь... если оно есть, конечно.
← →
QAZ (2011-09-26 22:54) [22]посылка каких либо сообщений кому либо не может быть плохо в принципе, ибо это суть винды
а вот запуски вторых,третих и прочих копий приложения вот это ни есть хорошо, хотябы потому что серьезные программы подобными финтами не страдают
← →
Юрий Зотов © (2011-09-26 23:03) [23]> QAZ (26.09.11 22:54) [22]
> посылка каких либо сообщений кому либо не может быть плохо в
> принципе, ибо это суть винды
Значит, это все-таки способ нормальный, а не 0нальный. Что ж, уже хорошо.
> а вот запуски вторых,третих и прочих копий приложения вот это ни есть
> хорошо, хотябы потому что серьезные программы подобными финтами не
> страдают
1. Откуда Вы знаете, как оно реализовано в других программах? Вы их все исследовали?
2. Это единственный аргумент, или есть более весомые?
← →
Jeer © (2011-09-26 23:11) [24]
> потому что серьезные программы
..вполне себе допускают запуск второй копии и серьезные программисты не страдают фигней.
← →
DVM © (2011-09-26 23:19) [25]
> Gu (26.09.11 13:51)
Я когда то делал подобное посылкой WM_DROPFILES из второй копии программы окну первой. Так как первая у меня все равно обрабатывала WM_DROPFILES, то было несложно послать это сообщение точно так же как это делает проводник.
Вторая копия после закрывалась.
← →
QAZ (2011-09-26 23:38) [26]
> Значит, это все-таки способ нормальный, а не 0нальный. Что
> ж, уже хорошо.
я имел в виду связку с "вторая копия" а не мессажи вообще
> 1. Откуда Вы знаете, как оно реализовано в других программах?
> Вы их все исследовали?
их не обязательно прямотаки исследовать если знаеш где смотреть
на вскидку:все программы MS,Corel,Adobe,Autodesk,Borland\Embarcadero...
> ..вполне себе допускают запуск второй копии
вторая рабочая копия и копия для передачи кс это разные вещи
> 2. Это единственный аргумент, или есть более весомые?
а по вашему пример с кагого либо faq\форума весомей сложившейся культуры программирования серьезного\качественного софта и рекомендаций MS?
← →
Юрий Зотов © (2011-09-27 00:03) [27]> QAZ (26.09.11 23:38) [26]
Какой из них весомей - тот, который позволяет решить задачу проще, быстрее и надежнее. И если программа изначально не предназначена под DDE (COM, что угодно еще), то зачем городить монстра ТОЛЬКО ради того, чтобы всего лишь передать параметр?
← →
Германн © (2011-09-27 00:49) [28]
> а по вашему пример с кагого либо faq\форума весомей сложившейся
> культуры программирования серьезного\качественного софта
> и рекомендаций MS?
Вот про рекомендации MS пожалуйста подробнее.
Про форумы и ихние факи мы наслышаны достаточно. :)
← →
Германн © (2011-09-27 01:01) [29]Да и насчёт "культуры программирования" тоже хотелось бы услышать ваше аргументированное сообщение.
Пока я вижу только "невразумительный бред новичка"!
← →
Gu (2011-09-27 03:11) [30]
> Плохиш © (26.09.11 14:39) [7]
> На делфимастере эта тема обсасывается каждые полгода.
можно еще ляпнуть, что человечество настолько тупое, что каждый год в школу ходит.
> Юрий Зотов © (26.09.11 17:56) [13]
> На "Королевстве" есть статья Антона Григорьева, в которой
> Ваша задача подробно разобрана. С объяснениями, с работающим
> примером и его кодом. Называется она как-то так: "Обобщающие
> примеры работы с WinAPI". Там три статьи с таким названием,
> но разных авторов - Вам нужен пример Антона.
нашел, да, похоже это оптимальный метод. честно говоря о наличии таких "ящиков" даже не знал. вот решение подробно описаное с примером работы: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=904
всем спасибо.
← →
И. Павел © (2011-09-27 08:29) [31][9]-[30] "Ну вы, блин, даете..." (C)
← →
QAZ (2011-09-27 13:23) [32]
> Какой из них весомей - тот, который позволяет решить задачу
> проще, быстрее и надежнее. И если программа изначально не
> предназначена под DDE (COM, что угодно еще), то зачем городить
> монстра ТОЛЬКО ради того, чтобы всего лишь передать параметр?
какого нафиг монстра? DDE это всего 4 сообщения,а не какаято неведомая "технология" про которую даже в книгах не знают что написать
и весь код использования (10 строк) не больше любой возьни с мьютексами,мапедфайлами,атомами и прочего
и работает с любым приложением имеющим хоть одно окно,хоть с СОМ хоть с чем
> Германн © (27.09.11 00:49) [28]
> Германн © (27.09.11 01:01) [29]
это когда люди читают в msdn\sdk как и при каких условиях изпользовать те или иные функции\сообщения
а не копипастять с форумов,а потом страдают синдромом говнокода с вопросами типа "почему у меня работает а у Васи нет" или всеми любимый "в ХР пашет ,а в висте вылетает,это глюк винды?"
← →
Gu (2011-09-27 14:30) [33]
> И. Павел © (26.09.11 14:11) [4]
> И. Павел © (26.09.11 14:13) [5]
вот еще что хотел спросить - про отправку сообщений. работают оба примера, но в обоих случаях (win7,delphiXe) у меня при получении данных и их отображении длинна отправляемой строки всегда не равна получаемой(меньше) либо при приеме и показе строки - после нескольких символов начинаются кракозябры. может что то не так делаю?// отправка
procedure TSenderMainForm.SendString; // в онклик
var
stringToSend : string; hhh:thandle;
copyDataStruct : TCopyDataStruct;
begin
stringToSend := "About Delphi Programming";
copyDataStruct.dwData := 0;
copyDataStruct.cbData := 1 + Length(stringToSend) ;
copyDataStruct.lpData := PChar(stringToSend) ;
hhh:=FindWindow("TMainForm", nil);if hhh=0 then exit;
SendMessage ( hhh, WM_COPYDATA, 0, integer(@copyDataStruct));
end;
// прием
procedure TMainForm.ReceiveMessage (var Msg: TWMCopyData);
var s:string;
begin
s := PChar(Msg.CopyDataStruct.lpData) ;
showmessage(s+" "+inttostr(length(s)));
end;
но если при отправке ставлю copyDataStruct.cbData := Length(stringToSend) *3; то все норм (или просто большое число) и строки равны. Почему так, ведь вроде все верно? Или это связано с новыми строковыми типами delphiXe и как тогда лечить?
← →
QAZ (2011-09-27 14:34) [34]
> Gu (27.09.11 14:30) [33]
книжку прочитай,хоть какунибудь
Length измеряеца в количестве букв
cbData измеряется в байтах
а в уникоде 2 байта на букву
← →
MBo © (2011-09-27 14:36) [35]>Или это связано с новыми строковыми типами delphiXe
Естественно -
>copyDataStruct.cbData := 1 + Length(stringToSend) ;
← →
QAZ (2011-09-27 14:43) [36]
> hhh:=FindWindow("TMainForm", nil);if hhh=0 then exit;
поздравляю с говнокодом :)
← →
Gu (2011-09-27 14:45) [37]ясно, вроде copyDataStruct.cbData := 2 + Length(stringToSend) *2; работает норм
← →
Gu (2011-09-27 14:47) [38]
> поздравляю с говнокодом :)
это к чему? в тестовых прогах такое запрещено? или у вас у одного код самый верный, а все остальные лохи?
← →
QAZ (2011-09-27 14:59) [39]
> это к чему?
чтоб не забыл что код тестовый :)
разделение на тестовый\рабочий уже хорошая база для ошибок типа "забыл букву поменять"
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c