Форум: "WinAPI";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
ВнизКаким образом лучшее всего передать инфо из проги в прогу? Найти похожие ветки
← →
oduvan (2002-08-13 16:12) [0]Каким образом лучшее всего передать инфо из проги в прогу?
Если Messaga"ми, то как передать текстовую строку (string или PCHAR), я так понял, что нужно зоздавать свой Тип Мессаджа там WM_USER+NNN. Поможите мастаки!
← →
MBo (2002-08-13 16:13) [1]wm_copydata
← →
Alx2 (2002-08-13 16:29) [2]>MBo © (13.08.02 16:13)
Местами встречаются интересные казусы с этим wm_copydata.
← →
Игорь Шевченко (2002-08-13 16:31) [3]Через MMF, к примеру
← →
MBo (2002-08-13 16:42) [4]>Alx2
Большой практики нет. Какие?
← →
Alx2 (2002-08-13 16:48) [5]>MBo © (13.08.02 16:42)
На вскидку:
Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM;
Str : String;
DataStruct : TCOPYDATASTRUCT;
Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM);
If nCode = hcbt_ACTIVATE
Then
Begin
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
Str := CBTCreateWnd^.lpCs^.lpszClass; // - накрывается при таком подходе (используем переданный класс).
with DataStruct do
begin
dwData := wParam;
cbData := Length(Str)+4;
lpData := Pointer(Str);
end;
SendMessage(MyWindow, WM_CopyData, 8101973, Integer(@DataStruct));
End;
End;
А так - работает
Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM;
Str : String;
DataStruct : TCOPYDATASTRUCT;
Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM);
If (nCode = hcbt_ACTIVATE Then
Begin
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
SetLength(Str,255);
GetClassName(wParam,PChar(Str),255); // Класс окна получаем заново, не используя переданное
Str := PChar(Str);
with DataStruct do
begin
dwData := wParam;
cbData := Length(Str)+4;
lpData := Pointer(Str);
end;
SendMessage(MyWindow, WM_CopyData, 8101973, Integer(@DataStruct));
End;
End;
Подробнее завтра воспроизведу.
Пишу второпях уже, могу поднагнать, как обычно :))
← →
Игорь Шевченко (2002-08-13 16:59) [6]Alx2 © (13.08.02 16:48)
Нда...
← →
Alx2 (2002-08-13 17:03) [7]>Игорь Шевченко © (13.08.02 16:59)
А конкретнее?
← →
Игорь Шевченко (2002-08-13 17:15) [8]ShellProc и MyWindow в одном процессе ?
← →
Alx2 (2002-08-13 17:17) [9]Нет.
← →
Игорь Шевченко (2002-08-13 17:24) [10]Зачем такие заморочки со строками ?
И зачем +4 у cbData ?
И что на приемной стороне ?
← →
Alx2 (2002-08-13 17:33) [11]>Игорь Шевченко © (13.08.02 17:24)
4 байта - потому-что строка.
А заморочки такие давно канули в лету. Просто сам факт остался непонятым. То что это можно обойти - само собой. Но тут уже дело в принципе.
← →
Alx2 (2002-08-13 17:36) [12]Забыл про обратную сторону:
Procedure TWatcherForm.onCopyData(Var Msg: TMessage);
Var
wProcessID: DWORD;
S: String;
ID: Integer;
Begin
<что-то обрабатываем и инициализируем>
Memo1.Lines.Add(DateTimeToStr(Now) + "> " + GetExeName(wProcessID) + " (" +
IntToStr(wProcessID) + "): " +
String(PCopyDataStruct(Msg.LPARAM)^.lpData)); // используем переданный string
End;
End;
← →
Игорь Шевченко (2002-08-13 17:39) [13]А так:
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
with DataStruct do begin
dwData := wParam;
cbData := StrLen(CBTCreateWnd^.lpCs^.lpszClass)+1;
lpData := CBTCreateWnd^.lpCs^.lpszClass;
end;
SendMessage(MyWindow, WM_CopyData, 8101973, Integer(@DataStruct));
А на приемной стороне как сейчас...
← →
cdaDmitriy (2002-08-13 17:40) [14]Alx2 © Так это 2 процесса ???
← →
Alx2 (2002-08-13 17:44) [15]>cdaDmitriy © (13.08.02 17:40)
Да. И даже больше
>Игорь Шевченко © (13.08.02 17:39)
Ну в этом случае чистый pchar просто передаем.
А затык был именно на разнице между
Str := CBTCreateWnd^.lpCs^.lpszClass;
и
SetLength(Str,255);
GetClassName(wParam,PChar(Str),255); // Класс окна получаем заново, не используя переданное
Str := PChar(Str);
← →
Alx2 (2002-08-13 17:48) [16]>Игорь Шевченко © (13.08.02 17:39)
Извини, невнимательно посмотрел. По-моему так тоже пробовал. Траблы оставались.
← →
Игорь Шевченко (2002-08-13 17:49) [17]Alx2 © (13.08.02 17:44)
Насколько я понял и надо передавать именно PChar из которого на приемной строне String делается.
Я не признаю такого рода заморочки с AnsiString, уж больно чреваты они подводными камнями.
← →
Alx2 (2002-08-13 18:05) [18]Попробовал еще раз :)
Все сдохло моментально ...
← →
Игорь Шевченко (2002-08-13 18:13) [19]Alx2 © (13.08.02 18:05)
Сдохло при передаче или при приеме ? (я, кстати, в аську стукнул)
← →
cdaDmitriy (2002-08-13 18:36) [20]Игорь Шевченко © (13.08.02 16:31)
Через MMF, к примеру
Что имеешь в виду расшифруй
← →
Игорь Шевченко (2002-08-13 18:41) [21]cdaDmitriy © (13.08.02 18:36)
MMF - Memory mapped files
← →
cdaDmitriy (2002-08-13 18:42) [22]Это понятно ну а дальше
← →
Игорь Шевченко (2002-08-13 18:47) [23]cdaDmitriy © (13.08.02 18:42)
Дальше - Program Files/Borland/Delphi/Demos/IPCDemos/*.*
← →
wal (2002-08-14 14:22) [24]А еще можно использовать DDE
← →
cdaDmitriy (2002-08-14 14:26) [25]>>wal © (14.08.02 14:22)
>A еще можно использовать DDE
OLE ,COM, DCOM, ActiveX и так далее ....
← →
Garrison (2002-08-15 17:47) [26]А Memory Mapped Files не пробовали?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c