Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

Передать 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.011 c
3-1269448285
учителка
2010-03-24 19:31
2012.01.01
удаление записи из записи


15-1312403395
Юрий
2011-08-04 00:29
2012.01.01
С днем рождения ! 4 августа 2011 четверг


2-1316568187
Юзернейм
2011-09-21 05:23
2012.01.01
sysenter


2-1317116536
Очень Злой
2011-09-27 13:42
2012.01.01
Можно ли вснести изменения в класс


15-1316065835
Gu
2011-09-15 09:50
2012.01.01
Свернуть процедуры