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

Вниз

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

Наверх




Память: 0.55 MB
Время: 0.037 c
2-1159528840
RebroFF
2006-09-29 15:20
2006.10.15
Корректное отображение кириллицы


2-1159685512
Roeg
2006-10-01 10:51
2006.10.15
Как вывести чужое окно на передний план?


2-1159628079
pqpqp
2006-09-30 18:54
2006.10.15
if else


3-1155824707
incm
2006-08-17 18:25
2006.10.15
Как используя BDE и MS SQL Server получать RAISEROR( Err ,10)


10-1124082080
safo
2005-08-15 09:01
2006.10.15
Проблема с файлом Excel