Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо