Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SendMessage и 2 приложения 
:(
    Опции темы
maloicds
Дата 25.8.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 20.10.2009
Где: Москва

Репутация: нет
Всего: нет



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

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, тоже не хочет.
PM MAIL   Вверх
kami
Дата 25.8.2012, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



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

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

Как пробовал?
PM MAIL WWW   Вверх
maloicds
Дата 25.8.2012, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 20.10.2009
Где: Москва

Репутация: нет
Всего: нет



Код

  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;

PM MAIL   Вверх
maloicds
Дата 26.8.2012, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 20.10.2009
Где: Москва

Репутация: нет
Всего: нет



Вопрос решен.

Код

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;

Всем спасибо!
PM MAIL   Вверх
northener
Дата 26.8.2012, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: нет
Всего: 20



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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.