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

Вниз

Не работает посылка сообщения в другую прогу!!!   Найти похожие ветки 

 
oduvan ©   (2002-08-13 17:20) [0]

Сообщение посылается, но теряются данные (это когда обмениваются 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;


 
cdaDmitriy ©   (2002-08-13 17:26) [1]

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


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

cdaDmitriy © (13.08.02 17:26)

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

oduvan © (13.08.02 17:20)

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


 
cdaDmitriy ©   (2002-08-13 17:34) [3]

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

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

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


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

cdaDmitriy © (13.08.02 17:34)

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


 
oduvan ©   (2002-08-13 18:08) [5]

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


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

oduvan © (13.08.02 18:08)

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


 
oduvan ©   (2002-08-13 18:20) [7]

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


 
cdaDmitriy ©   (2002-08-13 18:24) [8]

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

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


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

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



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

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


 
oduvan ©   (2002-08-13 18:37) [10]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
1-98159
X-Vizitor
2002-09-17 21:49
2002.09.30
Как проверить кем закрывается приложение


3-97968
tomat
2002-09-09 11:42
2002.09.30
dbf -> IB


14-98262
VEG
2002-09-01 14:19
2002.09.30
Издеваемся над вениками:-)


8-98237
skywalker
2002-02-15 16:03
2002.09.30
---|Ветка была без названия|---


14-98308
Испуганный
2002-09-03 20:23
2002.09.30
Налоговая отбирает компы за отсутствие лицензий