Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать String другому приложению [D7]


Страницы:   1 2

flaxe ©   (2006-09-05 20:22:00) 

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


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


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


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


Ketmar   (2006-09-07 16:38:00) [2]

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


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


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


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


Ketmar   (2006-09-07 16:24:00) [4]

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


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


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


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


DVM   (2006-09-07 16:16:00) [6]


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

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


Ketmar   (2006-09-07 16:15:00) [7]

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


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


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


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

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


DVM   (2006-09-07 16:10:00) [9]

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


Ketmar   (2006-09-07 16:06:00) [10]

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


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


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


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


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


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


GanibalLector   (2006-09-07 15:49:00) [12]


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 RegisterWindowMessagefunction 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... и последующем приеме, НО вразумительного ответа не было :(
Мне как... создать новую ветку или тут ?


evvcom   (2006-09-07 10:27:00) [13]

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

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


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

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

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


Elen   (2006-09-07 09:32:00) [15]


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

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


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


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

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


vodvorezlaya   (2006-09-07 09:14:00) [17]


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

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


Elen   (2006-09-07 09:02:00) [18]


> vodvorezlaya

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


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


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

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


Elen   (2006-09-07 08:34:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо