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

Вниз

sendmessage   Найти похожие ветки 

 
velsi   (2003-05-16 10:20) [0]

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

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

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


 
MBo ©   (2003-05-16 10:23) [1]

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


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

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));


 
Digitman ©   (2003-05-16 11:10) [3]

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 11:17) [4]

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:38) [5]


> 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:55) [6]

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

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 12:20) [7]

вот это

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 12:31) [8]

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

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

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

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


 
MetalFan ©   (2003-05-16 12:40) [9]


> velsi

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


 
Digitman ©   (2003-05-16 12:42) [10]

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

затем сделай

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

begin

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

end;

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

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


 
Digitman ©   (2003-05-16 12:47) [11]

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


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

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


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

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

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


 
Digitman ©   (2003-05-16 13:56) [14]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
14-55733
Vlad Oshin
2003-06-30 11:25
2003.07.17
Рассказ. Дед Кулик


11-55481
SPeller
2002-11-06 12:37
2003.07.17
Рассылка новостей KOL & MCK


3-55416
seu
2003-06-24 07:30
2003.07.17
ADO+MIDAS


3-55473
softmaster
2003-06-22 20:15
2003.07.17
Вопрос по генерации автоинкрементных полей


1-55501
corte ™
2003-07-04 14:58
2003.07.17
как отставить выделение на treeview хотя фокус перешел.