![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PostThreadMessage [D5]
RazorbladE © (2002-04-30 11:44:00)PostThreadMessage ?
Мастера! Q: Как передать при помощи функции PostThreadMessage
ДРУГОМУ приложению (если известно ThreadID того приложения), структуру
данных, как это сделано в ниже приведённом примере (для одного приложения)
с функцией SendMessage:
(Ошибка возникает при попытке "распаковать" данные...)
const
WM_SETCPT = WM_USER + 1;
type
TWmSetCpt = packed record
Msg: Cardinal;
Capt: PcHar;
end;
TForm1 = class(TForm)
.....
procedure Button1Click(Sender: TObject);
private
procedure WmSetCpt(var Message: TWmSetCpt); message WM_SETCPT;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.WmSetCpt(var Message: TWmSetCpt);
var Z: ^TWmSetCpt;
begin
Z := Pointer(message.Capt);
ShowMessage(Z.Capt);
end;
procedure TForm1.Button1Click(Sender: TObject);
var x: TWmSetCpt;
begin
x.Capt := PcHar(Caption);
SendMessage(Handle, WM_SETCPT,LongInt(@X), -1);
end;
troits (2002-04-30 12:13:00) [1]Прошу прощения - невнимательно прочитал вопрос. WM_COPYDATA должен посылаться только через SendMessage.
Если уж так неужно посылать сообщение через PostMessage, можно ,например, отмаппить (CreateFileMapping / MapViewOfFile) файл, в "передатчике" писать туда данные, post - ить сообщение и в "приемнике" извлекать.
troits (2002-04-30 12:01:00) [2]Нет, так нельзя.
Есть много способов передавать данные между процессами.
Один из них - сообщение WM_COPYDATA
Заполняешь 3 поля
tagCOPYDATASTRUCT = packed record
dwData: DWORD;
cbData: DWORD;
lpData: Pointer;
end;
и
SendMessage(
DestWnd, // handle to destination window
WM_COPYDATA, // message to send
WPARAM( Handle), // handle to window (HWND)
LPARAM(@YourCOPYDATASTRUCT));
А в окне - приемнике "ловишь" WM_COPYDATA и извлекаешь из
COPYDATASTRUCT все, что нужно...