Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Передать String другому приложению   Найти похожие ветки 

 
flaxe ©   (2006-09-05 20:22) [0]

Нужно сделать обмен между множеством совершенно одинаковых приложений с одним другим, которое исполняет роль пульта управления.
Как организовать обмен данными типа string между приложениями?


 
Eraser ©   (2006-09-05 20:26) [1]

> [0] flaxe ©   (05.09.06 20:22)

используй один из механизмов IPC (межпроцессной коммуникации), например сообщение WM_COPYDATA или Named Pipes.


 
flaxe ©   (2006-09-05 21:00) [2]

Допустим если через WM_COPYDATA... у меня получается такая проблема, все приложения запускаются из одного exe-шника с различными параметрами при этом названия окна каждое приложение имеет свое(в соответсвии с параметром, причем оно может динамически меняться), как мне в таком случае получить handle всех окон? названия процессов все одинаковы - mprog.exe - можно както это задействовать?


 
Джо ©   (2006-09-05 21:25) [3]

> [2] flaxe ©   (05.09.06 21:00)
> Допустим если через WM_COPYDATA... у меня получается такая
> проблема, все приложения запускаются из одного exe-шника
> с различными параметрами при этом названия окна каждое приложение
> имеет свое(в соответсвии с параметром, причем оно может
> динамически меняться), как мне в таком случае получить handle
> всех окон? названия процессов все одинаковы - mprog.exe
> - можно както это задействовать?

EnumWindows для перебора всех окон. А для идентификации окон не лучше ли использовать предопределенные классы окон?


 
isasa ©   (2006-09-05 21:27) [4]

В запускающем приложении "помнить" все хендлы запускаемых. В вызываемый передавать параметром(или как там еще) хендл главного(куда будем  WM_COPYDATA).


 
flaxe ©   (2006-09-05 22:59) [5]

У меня какой-то бред немножко...
если я ловлю хендл по имени окна, я могу послать и WM_COPYDATA и WM_CLOSE(для примера).
если я ловлю хендл по имени процесса, WM_CLOSE работает, а WM_COPYDATA - нет, создаю чистое приложение... в этот раз я нахожу два хэндла с именем этого процесса и на одном из них все работает


 
tesseract ©   (2006-09-05 23:21) [6]

> [5] flaxe ©   (05.09.06 22:59)


String не передашь, только указатель или Pchar.

А что с перехватом WM_COPYDATA? Имей в виду EnumWindows тебе первое окно и выдаст.


 
Сергей М. ©   (2006-09-06 09:21) [7]


> flaxe ©   (05.09.06 22:59) [5]


> ловлю хендл по имени окна


Имени какого окна ? Приложение может создать более чем одно окно..


> хендл по имени процесса


Это как ?


 
Ганна Юхимівна   (2006-09-06 17:39) [8]


> я нахожу два хэндла с именем этого процесса и на одном из
> них все работает


Handle окна может меняться... учтите это !


 
DVM ©   (2006-09-06 17:51) [9]


> Нужно сделать обмен между множеством совершенно одинаковых
> приложений с одним другим

Через сокеты надо. Это ж сервер и клиенты.


 
ychenick ©   (2006-09-06 19:48) [10]


> Через сокеты надо. Это ж сервер и клиенты.


и что, предлагаеш открывать порты?

Думаю всетаки нужно использовать SandMessage и обработчик сообщений к нему.


 
vodvorezlaya   (2006-09-07 08:29) [11]


> Как организовать обмен данными типа string между приложениями?

Вообще если не по сети то через Atom.
Я писал правда на форуме, но никто так и не знает как ими пользоваться.


 
Elen ©   (2006-09-07 08:34) [12]

Мастера ! А чем DDE хуже атомов или сокетов?


 
vodvorezlaya   (2006-09-07 08:57) [13]


> Elen ©   (07.09.06 08:34) [12]
> Мастера ! А чем DDE хуже атомов или сокетов?

А как считаешь лучше создать по десятку алгоритмов, заполнять кучу фигни записывать её кудато на сервер или просто передать часть данных по ОЗУ.


 
Elen ©   (2006-09-07 09:02) [14]


> vodvorezlaya

Почему-же DDE достаточно просто настраивать - установить связь с сервером и элементом и описать событие получения. На Делфи для этого все предусмотренно


 
vodvorezlaya   (2006-09-07 09:14) [15]


> Почему-же DDE достаточно просто настраивать - установить
> связь с сервером и элементом и описать событие получения.
>  На Делфи для этого все предусмотренно

А скорость? А ресурсы?
(Скорость ОЗУ измеряется в наносекундах)


 
vodvorezlaya   (2006-09-07 09:29) [16]


> Ганна Юхимівна   (06.09.06 17:39) [8]
>
> > я нахожу два хэндла с именем этого процесса и на одном
> из
> > них все работает
>
>
> Handle окна может меняться... учтите это !

Но caption окна не меняется, а handle всегда можно найти по caption


 
Elen ©   (2006-09-07 09:32) [17]


> А скорость? А ресурсы?

Разве DDE работает медленно??? Вроде не было таких проблем у меня.


 
Сергей М. ©   (2006-09-07 09:39) [18]

Для IPC в пределах одной и той же машины лучше [Named]Pipes и MMF не придумать. Правда, NamedPipes не удастся использовать в Win9x/Me.

Можно еще и LPC/RPC прикрутить для этой цели, но это больше отдает стрельбой из пушки по воробьям.


 
evvcom ©   (2006-09-07 10:27) [19]

> [16] vodvorezlaya   (07.09.06 09:29)
> Но caption окна не меняется, а handle всегда можно найти
> по caption

Caption иногда и меняется. Кто ж мне запретит его менять? Также и 2 одинаковых Caption может быть у 2 разных совершенно окон. Так помню какой-то компонент еще для Delphi 3 вроде защищали. Искали окно дельфовое с его Caption, защита ломалась путем создания скрытого окна любого класса с таким же Caption. :)


 
GanibalLector ©   (2006-09-07 15:49) [20]


procedure TForm1.WndProc(var Message: TMessage);
   var pcd: PCopyDataStruct;
begin
 if Message.Msg=WM_COPYDATA then
 begin
   pcd := PCopyDataStruct(Message.LParam);
   Memo1.Lines.Add(PChar(pcd.lpData));
 end else inherited WndProc(Message);
end;

procedure TForm1.Button1Click(Sender: TObject);
 var cd: TCopyDataStruct;
begin
 cd.cbData := Length(Edit1.Text) + 1;
 cd.lpData := PChar(Edit1.Text);
 SendMessage(HWND_BROADCAST, WM_COPYDATA, 0, LParam(@cd));
end;

НО!!! Исходя из Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function to obtain a unique message for inter-application communication.
насколько я понял делать так не рекомендуется.

Посему подход таков :
-проецирем стоку в память (CreateFileMapping);
-извещаем все окна о событии, что строка в памяти;(SendMessage(HWND_BROADCAST...)
-ловим сообщение в другом АП и достаем строку (OpenFileMapping)

Код:

...
 private
   h:HWND;
...  

procedure TForm1.FormCreate(Sender: TObject);
begin
 h:=RegisterWindowMessage("GanibalLector");
end;

procedure TForm1.Button1Click(Sender: TObject);
 var hMap:THandle;
     hView:Pointer;
begin
 hMap:=CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,$FF,"MMF");
 if hMap<>0 then
 begin
   hView:=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,$FF);
   StrCopy(PChar(hView),PChar(Edit1.Text));
   SendMessage(HWND_BROADCAST,h,0,0);// тут у меня самого вопросы
   UnmapViewOfFile(hView);
   CloseHandle(hMap);
 end;
end;

procedure TForm1.WndProc(var Message: TMessage);
 var hMap:THandle;
     hView:Pointer;
begin
  if Message.Msg = h then
  begin
    hMap:=OpenFileMapping(FILE_MAP_READ,False,"MMF");
    if hMap<>0 then
    begin
      hView:=MapViewOfFile(hMap,FILE_MAP_READ,0,0,$FF);
      Memo1.Lines.Add(String(PChar(hView)));
      UnmapViewOfFile(hView);
      CloseHandle(hMap);
    end;
  end else  inherited WndProc(Message);
end;


Все работает. Насколько это логично и правильно - неизвестно.По сути-велосипед :)  
Кстати, у меня самого вопросы появились...
Итак,  логичнее было бы послать PostMessage. Но в тоже время  PostMessage операция асинхронная!!! и успеет ли событие дойти до того как произойдет удаление проецируемой строки? Проверить не смог  по причине того, что после отправки  PostMessage(HWND_BROADCAST сообщения мне НЕ приходят.

В свое время я задавал вопрос о  PostMessage(HWND_BROADCAST... и последующем приеме, НО вразумительного ответа не было :(
Мне как... создать новую ветку или тут ?


 
Сергей М. ©   (2006-09-07 16:03) [21]


> успеет ли событие дойти до того как произойдет удаление
> проецируемой строки?


Полагаться на это не стОит. Ибо нельзя по идеологии механизма.
так что вовремя у тебя вопросы появились.


> Мне как... создать новую ветку или тут ?


Наверно, лучше новую


 
Ketmar ©   (2006-09-07 16:06) [22]

задам любимый вопрос: а почему бы не использовать сокеты? %-)


 
DVM ©   (2006-09-07 16:10) [23]

Лучше через сокеты. Потом мало ли приложения на разных компах захотят запускать, а тут все уже готово. И потом сокеты это не только сеть.


 
Сергей М. ©   (2006-09-07 16:11) [24]


> Ketmar ©   (07.09.06 16:06) [22]


Ох и любишь ты с дуба падать)..

Ну нафига, скажи, человеку "тормоза" тырнет-протоколов, ежели он о тырнете и слыхом не слыхивал в своей задаче ?)


 
Ketmar ©   (2006-09-07 16:15) [25]

> [24] Сергей М. ©   (07.09.06 16:11)
ну люблю я сокеты. %-) API простой. удобно. у меня даже недописаный shell с компонентами своими через сокеты разговаривал. %-)


 
DVM ©   (2006-09-07 16:16) [26]


> Сергей М. ©   (07.09.06 16:11) [24]

Зачем в юниксе были сокеты, когда о тырнете и сетях никто и не слышал?


 
Сергей М. ©   (2006-09-07 16:17) [27]


> Ketmar ©   (07.09.06 16:15) [25]


Про "овощи", которые д.б. употреблены всяк к своему месту и времени, обратись к ИШ)


 
Ketmar ©   (2006-09-07 16:24) [28]

> [27] Сергей М. ©   (07.09.06 16:17)
а что тут обращаться? в *nix сокеты служили втом числе и для IPC. не вижу, отчего бы их не использовать в этом качестве и сейчас. %-)


 
Сергей М. ©   (2006-09-07 16:33) [29]


> Ketmar ©   (07.09.06 16:24) [28]


в *nix и пайпы те же самые имеются, ежели ты в курсе)


 
Ketmar ©   (2006-09-07 16:38) [30]

> [29] Сергей М. ©   (07.09.06 16:33)
а ещё сигналы и много других страшных слов. %-)


 
Сергей М. ©   (2006-09-07 16:46) [31]


> Ketmar ©   (07.09.06 16:38) [30]


так точно, сэр)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1159436629
RainKMM
2006-09-28 13:43
2006.10.15
Список каталогов


1-1156821234
trackbar
2006-08-29 07:13
2006.10.15
Smooth ScrollBox :)


2-1159276169
Asdpro
2006-09-26 17:09
2006.10.15
Создание меню из дерева каталогов и файлов


2-1159195466
vyper
2006-09-25 18:44
2006.10.15
Как убить процесс


1-1157044552
nali
2006-08-31 21:15
2006.10.15
Что вызывать Update или Invalidate?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский