Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1316683686
pavor
2011-09-22 13:28
2012.01.01
Длина поля String в ClientDataSet


15-1316145972
vajo
2011-09-16 08:06
2012.01.01
Win XP. Проблема входа в систему.


15-1315945785
Юрий
2011-09-14 00:29
2012.01.01
С днем рождения ! 14 сентября 2011 среда


3-1269443878
gog
2010-03-24 18:17
2012.01.01
Не читаются unicode данные


2-1316610955
Псарь
2011-09-21 17:15
2012.01.01
Мерцает окно при изменении размеров.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский