Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > SendMessage и 2 приложения


Автор: maloicds 25.8.2012, 22:46
Добрый день. Пытаюсь отправить сообщение другому окну:
передача
Код

program DataSender;
uses windows, messages;
var
  h: THANDLE;
  s:string;
begin
 s:='TEST';
 h := FindWindow(nil, 'MyForm');
 SendMessage(h,2222,0,integer(pchar(s)));
end.


и приём в другом приложении
Код

private
procedure mes(var msg:TMessage); message 2222;
...
procedure TForm1.mes(var msg: TMessage);
begin
 Memo1.lines.add(pchar(msg.lParam));
end;


При таком раскладе у приемной стороны происходит ошибка, но когда всё находиться в одном приложении, то всё прекрасно работает.
Пробовал с WM_COPYDATA, тоже не хочет.

Автор: kami 25.8.2012, 23:00
Цитата(maloicds @  25.8.2012,  22:46 Найти цитируемый пост)
При таком раскладе у приемной стороны происходит ошибка,

Конечно. Каждый процесс работает в своей "песочнице" и память, принадлежащая одному процессу недоступна для другого.
Вы передаете указатель на один участок памяти, а у принимающей стороны по такому же адресу может быть что угодно - мусор, код, или вообще по этому адресу память еще не выделена.
Цитата(maloicds @  25.8.2012,  22:46 Найти цитируемый пост)
Пробовал с WM_COPYDATA

Как пробовал?

Автор: maloicds 25.8.2012, 23:44
Код

  h := FindWindow(nil, 'MyForm');
  DataStruct.dwData := 0;
  DataStruct.cbData := length('TEST')+1;
  DataStruct.lpData := pchar('TEST');
  SendMessage(h, 2222, 0, integer(@DataStruct));

и приём
Код

procedure CopyData(var Msg: TWMCopyData); message 2222;
....
procedure TForm1.CopyData(var Msg: TWmCopyData);
var sMsg: String;
begin
  sMsg := PChar(Msg.CopyDataStruct.lpData);
  label1.Caption := sMsg;
end;

Автор: maloicds 26.8.2012, 00:15
Вопрос решен.

Код

program DataSender;
uses windows, messages;
var aCopyData: TCopyDataStruct;
    hTargetWnd: HWND;
begin
 aCopyData.dwData := 0;
 aCopyData.cbData := Length(PChar('test')) + 1;
 aCopyData.lpData := PChar('test');
 hTargetWnd := FindWindowEx(0, 0, nil, PChar('MyForm'));
 SendMessage(hTargetWnd, WM_COPYDATA, 0, Longint(@aCopyData))
end.

и приём
Код

procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
...
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var sText: array[0..99] of Char;
begin
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  memo1.Lines.Add(sText);
end;

Всем спасибо!

Автор: northener 26.8.2012, 01:54
Функция StrLCopy, имхо имела смысл только в первой версии Дельфи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)