Форум: "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