Форум: "Основная";
Текущий архив: 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.038 c