Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

SendMessage - проблемы. (WM_COPYDATA)   Найти похожие ветки 

 
Andy BitOff ©   (2005-12-08 18:53) [0]

Поясните мне пожалуйста следующий момент. Две моих программы общаются, точнее пытаются общаться, но у них это не особо хорошо получается =) посылая друг другу сообщения, в частности 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) во второй программе отрабатывает только один раз. В чем может быть проблема?


 
Leonid Troyanovsky ©   (2005-12-08 19:06) [1]


> Andy BitOff ©   (08.12.05 18:53)  

> программе отрабатывает только один раз. В чем может быть
> проблема?


А, часом, не изменяет получатель заголовок своего окна?

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-12-08 19:09) [2]


> Andy BitOff ©   (08.12.05 18:53)  


Кста, чего возвращает SendMessage.

--
Regards, LVT.


 
Andy BitOff ©   (2005-12-08 19:20) [3]

Leonid Troyanovsky ©   (08.12.05 19:06) [1]
А, часом, не изменяет получатель заголовок своего окна?


Нет.

Кста, чего возвращает SendMessage.

При первом True, при последующих False.


 
Leonid Troyanovsky ©   (2005-12-08 19:22) [4]


> Andy BitOff ©   (08.12.05 19:20) [3]

> Кста, чего возвращает SendMessage.

> При первом True, при последующих False.


Ну, и GetLastError..

--
Regards, LVT.


 
Andy BitOff ©   (2005-12-08 19:38) [5]

GetLastError возвращает 1400
SysErrorMessage(1400)="Недопустимый дескриптор окна"
За подсказку спасибо. =)

Интересно почему? Заголовок окна действительно не меняется. А можно запомнить хендел при первом вызове FindWindow и потом обращаться по нему.


 
Andy BitOff ©   (2005-12-08 19:43) [6]

Проверил, если запомнить хендл, то таже фигня.


 
Leonid Troyanovsky ©   (2005-12-08 19:45) [7]


> Andy BitOff ©   (08.12.05 19:38) [5]

>  А можно запомнить хендел при первом вызове FindWindow и
> потом обращаться по нему.


Он иногда меняется. Например, при выборе нек. стилей.
Короче, при RecreateWnd.

Про правильность FindWindow следует поподробней.

--
Regards, LVT.


 
Andy BitOff ©   (2005-12-08 19:59) [8]

Все разобрался. Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
2-1135357416
kop
2005-12-23 20:03
2006.01.15
DBMemo


14-1135146377
Гриха
2005-12-21 09:26
2006.01.15
NOD32


2-1135611497
kotbazilio
2005-12-26 18:38
2006.01.15
Удалить запись из таблицы


9-1122972298
Max4
2005-08-02 12:44
2006.01.15
Координаты клика.


6-1128355039
Evil Spirit
2005-10-03 19:57
2006.01.15
FTP через TClientSocket