Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
6-55700
Dion
2003-05-13 07:33
2003.07.17
Подскажите, Плз, как можно программно определить имя пользователя


1-55651
Rel_
2003-07-04 10:39
2003.07.17
TMemo


3-55397
Smalik
2003-06-23 13:56
2003.07.17
Сортировка в Grid e


6-55686
zom
2003-05-12 17:21
2003.07.17
Открытие сетевого соединения. Какое событие вызывается?


14-55847
Карлсон
2003-07-01 22:43
2003.07.17
полюса тороидального магнита.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский