![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать String другому приложению [D7]
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 хуже атомов или сокетов?