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

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

sendmessage [D5, Win95/98]


velsi ©   (2003-05-16 10:20:00) 

В windows 98 посылаю 2 сообщения через sendmessage, первое проходит, а второе нет - приложение вываливается с ошибкой

MY_App caused an invalid page fault in
module USER.EXE at 001e:00001df6.

В чем тут дело?


Digitman   (2003-05-16 13:56:00) [1]

тогда - что скажешь по поводу Digitman © (16.05.03 12:42) ?


velsi   (2003-05-16 13:55:00) [2]

Digitman:
а далее .... далее ройся в дебрях своего файл-мэппинга и "делаем что-то " - собственно прием сообщения, как видишь, не виноват)

Ага...прием тут совсем не причем, дело в отправке !!! Он отправлять не хочет, а не получать =) Получать, это уже совсем другая песня.


velsi   (2003-05-16 13:52:00) [3]

2Digitman: правильно....


Digitman   (2003-05-16 12:47:00) [4]

я правильно понимаю, что сообщение посылается окну именно "другого" процесса, не своего ?


Digitman   (2003-05-16 12:42:00) [5]

выкинь на время все из тела обработчика сообщения и убедись, что исключение исчезло

затем сделай

procedure TForm1.RevcieveMessage(var Msg: TMessage);
var
pcd : PCopyDataStruct;

begin

pcd := PCopyDataStruct(Msg.LParam);
Showmessage(string(PChar(pcd.lpData)));

end;

убедись, что и это исключений не вызывает

а далее .... далее ройся в дебрях своего файл-мэппинга и "делаем что-то " - собственно прием сообщения, как видишь, не виноват)


MetalFan   (2003-05-16 12:40:00) [6]


> velsi

WINDOWS 98 лицензионный? )))))
свежеустановленный?


velsi   (2003-05-16 12:31:00) [7]

>>If PChar(pcd.lpData)="Get the Data" then
>мне совершенно не нравится

с какой, спрашивается, стати указатель, полученный по PChar(pcd.lpData) (динамически формируемый системой в ран-тайм), будет равен указателю на строковую константу "Get the Data" (статически формируемый на этапах compile- + link- + load-time) ?

Если даже это и так, то это никак не должно вызывать ошибку у приложения, которое посылает сообщене. Причем такую ошибку....

В win 2000 это все прекрасно работает


Digitman   (2003-05-16 12:20:00) [8]

вот это

If PChar(pcd.lpData)="Get the Data" then

мне совершенно не нравится

с какой, спрашивается, стати указатель, полученный по PChar(pcd.lpData) (динамически формируемый системой в ран-тайм), будет равен указателю на строковую константу "Get the Data" (статически формируемый на этапах compile- + link- + load-time) ?

procedure TForm1.RevcieveMessage(var Msg: TMessage);
var
pcd : PCopyDataStruct;
s: string;
ThePtr1 : PChar;
begin

pcd := PCopyDataStruct(Msg.LParam);

s := string(PChar(pcd.lpData));
If s ="Get the Data" then
begin
if (TheMapHnd1 <> 0 then
begin
ThePtr1 := MapViewOfFile(TheMapHnd1,FILE_MAP_WRITE,0,0,0);
...делаем что-то // а что. собственно, "делаем"-то ?
UnmapViewOfFile(ThePtr1);
end;
end;
end;



velsi   (2003-05-16 11:55:00) [9]

Спасибо за подробное изложение =)

procedure RevcieveMessage (var Msg: TMessage); message WM_COPYDATA;

....

procedure TForm1.RevcieveMessage(var Msg: TMessage);
var
pcd : PCopyDataStruct;
ThePtr1 : PChar;
begin

pcd := PCopyDataStruct(Msg.LParam);

If PChar(pcd.lpData)="Get the Data" then
begin
if (TheMapHnd1 <> 0 then
begin
ThePtr1 := MapViewOfFile(TheMapHnd1,FILE_MAP_WRITE,0,0,0);
...делаем что-то
UnmapViewOfFile(ThePtr1);
end;
end;
end;


Digitman   (2003-05-16 11:38:00) [10]


> SendMessage(TheHWnd,WM_COPYDATA,TheHwnd, Lparam(@cd));


3-й параметр - хэндл окна-передатчика (!) сообщения , а не окна-приемника. Разница есть, как думаешь ?
Хотя это и не критично. Во всяком случае твой 0 в кач-ве этого параметра ни на что по сути не влияет. Параметр нужен в ряде случаев приложению-приемнику сообщения, дабы при необходимости знать, какому окну отправлять ответное сообщение.


> А поточнее можно?


По-русски что ли ? Так и говори)

Перевожу цитату их хэлпа "художественно" :

If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.

Если приложение, принимающее адресованное ему сообщение, должно иметь доступ к принимаемым данным ПОСЛЕ того, как завершится обработка сообщения, оно должно в обработчике сообщения скопировать эти данные в свой локальный буфер.

Как ты это сообщение передаешь - понятно, это особых нареканий не вызывает и не может быть источником указанного исключения.
Покажи, как принимаешь и обрабатываешь это сообщение.


velsi   (2003-05-16 11:17:00) [11]

SendMessage(TheHWnd,WM_COPYDATA,TheHwnd, Lparam(@cd));

Та же самая ошибка

>If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.

А поточнее можно?

Заранее всем спасибо.


Digitman   (2003-05-16 11:10:00) [12]

wParam = (WPARAM) (HWND) hwnd; // handle of sending window (у тебя почему-то = 0 ??)
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // pointer to structure with data

Кр.того

If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.

это условие соблюдается тобой ?


velsi   (2003-05-16 10:41:00) [13]

TheHWnd: HWnd;
cd : TCopyDataStruct;
...

TheHWnd:=FindWindow(nil, "Viewer");
if (TheHWnd=0) then Exit;
cd.cbData := Length("Get the Data")+1;
cd.lpData := PChar("Get the Data");
SendMessage(TheHWnd,{themes}WM_COPYDATA,0, Lparam(@cd));


MBo   (2003-05-16 10:23:00) [14]

подробности, код.


Наверх

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