![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SendMessage - проблемы. (WM_COPYDATA) [D7, WinXP]
Andy BitOff © (2005-12-08 18:53:00)Поясните мне пожалуйста следующий момент. Две моих программы общаются, точнее пытаются общаться, но у них это не особо хорошо получается =) посылая друг другу сообщения, в частности WM_COPYDATA. Вообщем приведу кусок кода и затем объясню проблему.
Первая программа:
procedure TMainForm.SomeProc1(Sender: TObject);
var
s:string;
cd:TCopyDataStruct;
...
begin
...
s:='SomeString';
cd.cbData := Length(s) + 1;
cd.lpData := PChar(s);
cd.dwData := 0;
SendMessage(FindWindow('Tfrm_Main','ListClient'),WM_COPYDATA,Longint(Handle), Longint(@cd));
...
end;
procedure TMainForm.SomeProc2(Sender: TObject);
var
s:string;
cd:TCopyDataStruct;
...
begin
...
s:='SomeString';
cd.cbData := Length(s) + 1;
cd.lpData := PChar(s);
cd.dwData := 0;
SendMessage(FindWindow('Tfrm_Main','ListClient'),WM_COPYDATA,Longint(Handle), Longint(@cd));
...
end;
FindWindow отрабатывает правильно.
Вторая программа:
type
Tfrm_Main = class(TForm)
...
private
...
procedure WMGetingRefer(var msg:TMessage); message WM_COPYDATA;
...
implementation
procedure Tfrm_Main.WMGetingRefer(var msg: TMessage);
var
pcd: PCopyDataStruct;
s:string;
begin
pcd := PCopyDataStruct(Msg.LParam);
s := PChar(pcd.lpData);
...
inherited;
end;
При посылке из первого приложения сообщения в первый раз, все отрабатывает правильно, но вот все последующие сообщения не доходят, т.е. эта процедура (WMGetingRefer) во второй программе отрабатывает только один раз. В чем может быть проблема?
Andy BitOff (2005-12-08 19:59:00) [1]Все разобрался. Спасибо.
Leonid Troyanovsky (2005-12-08 19:45:00) [2]
> Andy BitOff © (08.12.05 19:38) [5]
> А можно запомнить хендел при первом вызове FindWindow и
> потом обращаться по нему.
Он иногда меняется. Например, при выборе нек. стилей.
Короче, при RecreateWnd.
Про правильность FindWindow следует поподробней.
--
Regards, LVT.
Andy BitOff (2005-12-08 19:43:00) [3]Проверил, если запомнить хендл, то таже фигня.
Andy BitOff (2005-12-08 19:38:00) [4]GetLastError возвращает 1400
SysErrorMessage(1400)='Недопустимый дескриптор окна'
За подсказку спасибо. =)
Интересно почему? Заголовок окна действительно не меняется. А можно запомнить хендел при первом вызове FindWindow и потом обращаться по нему.
Leonid Troyanovsky (2005-12-08 19:22:00) [5]
> Andy BitOff © (08.12.05 19:20) [3]
> Кста, чего возвращает SendMessage.
> При первом True, при последующих False.
Ну, и GetLastError..
--
Regards, LVT.
Andy BitOff (2005-12-08 19:20:00) [6]Leonid Troyanovsky © (08.12.05 19:06) [1]
А, часом, не изменяет получатель заголовок своего окна?
Нет.
Кста, чего возвращает SendMessage.
При первом True, при последующих False.
Leonid Troyanovsky (2005-12-08 19:09:00) [7]
> Andy BitOff © (08.12.05 18:53)
Кста, чего возвращает SendMessage.
--
Regards, LVT.
Leonid Troyanovsky (2005-12-08 19:06:00) [8]
> Andy BitOff © (08.12.05 18:53)
> программе отрабатывает только один раз. В чем может быть
> проблема?
А, часом, не изменяет получатель заголовок своего окна?
--
Regards, LVT.