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

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

Не работает посылка сообщения в другую прогу!!! [D6, WinXP]


oduvan ©   (2002-08-13 17:20:00) 

Сообщение посылается, но теряются данные (это когда обмениваются 2 программы). Если весь этот код поместить в одну программу все работает, что я делаю не так???

Имеется:

const
WM_MAIN=WM_USER+10000;

type
TWMMain=packed record
msg:Cardinal;
Email:PCHar;
Text:PCHar;
end;

В одной форме:

SendMessage(FindWindow(pchar("TPostForm"),nil),WM_MAIN, integer(pChar(v1)),integer(pChar(v2)));

В другой:

private
procedure GetEmail(var msg:TWMMain);message WM_MAIN;
.......

procedure TPostForm.GetEmail(var msg:TWMMain);
begin
SetForegroundWindow(handle);
SetWindowPos(handle,HWND_TOPMOST,left,top,width,height,SWP_SHOWWINDOW);
SetWindowPos(handle,HWND_NOTOPMOST,left,top,width,height,SWP_SHOWWINDOW);
showmessage(msg.Email+" "+msg.Text);<- Тут выдает ошибку
end;


oduvan   (2002-08-13 18:37:00) [1]

ВСе ок! WM_COPYDATA работет отлично!


Игорь Шевченко   (2002-08-13 18:29:00) [2]

Джеффри Рихтер пишет правильно. А зачем таблицу атомов мучить ? Она не резиновая :-)))
Кстати, создается не совсем проекция файла, а просто выделяется область виртуальной памяти (section)


cdaDmitriy   (2002-08-13 18:24:00) [3]

(с) Джеффри Рихтер конечно поможет но и там написано :

Увидев, что Вы посылаете сообщение WM_COPYDATA, SendMessage создает проек цию файла размером cbData байтов и копирует данные из адресного пространства Вашей программы в эту проекцию. Затем отправляет сообщение окну-приемнику При обработке этого сообщения принимающей оконной процедурой параметр lParam указывает на структуру COPYDATASTRUCT, которая находится в адресном простран стве процесса-приемника Элемент lpData этой структуры указывает на проекцию файла в адресном пространстве процесса-приемника.


и тоже можно решить ( Я думаю ) с

ATOM GlobalAddAtom( LPCTSTR lpString
// pointer to the string to add
);


oduvan   (2002-08-13 18:20:00) [4]

Не ну на самом деле, елси ты понимаешь в этом, что тебе мешает объяснить? Хелп ми Плиз!


Игорь Шевченко   (2002-08-13 18:11:00) [5]

oduvan © (13.08.02 18:08)

Можно пример. У Джеффри Рихтера в книжке


oduvan   (2002-08-13 18:08:00) [6]

А как пользоваться этой WM_COPYDATA???
Можно пример для отправки данных и для получения, мне необходимо в программе передать 2 текстовых параметра, как реализовать?


Игорь Шевченко   (2002-08-13 17:41:00) [7]

cdaDmitriy © (13.08.02 17:34)

Поможет. (с) Джеффри Рихтер


cdaDmitriy   (2002-08-13 17:34:00) [8]

>> Игорь Шевченко да я конечно имел ввиду ( в 2 процессах )

и что WM_COPYDATA поможет ??? не уверен

Думаю нужно из строки получить <ATOM> и его уже передавать


Игорь Шевченко   (2002-08-13 17:29:00) [9]

cdaDmitriy © (13.08.02 17:26)

В одном процессе.

oduvan © (13.08.02 17:20)

используйте WM_COPYDATA


cdaDmitriy   (2002-08-13 17:26:00) [10]

потому что integer(pChar(v1)),integer(pChar(v2) имеет смысл только в первом потоке и адрес в этом потоке а не во втором


Наверх

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