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

Вниз

Hooks: память не может быть read.   Найти похожие ветки 

 
MikeZ   (2008-07-16 19:21) [0]

Всем привет!

Надо было сделать глобальный хук на создание окна (WH_SHELL + HSHELL_WINDOWCREATED). Делал хук по статье "Hooks - аспекты реализации" (http://delphimaster.ru/articles/hooks/index.html) и её 3-му примеру (http://delphimaster.ru/articles/hooks/example.zip). Выглядит это так:
Procedure SetHook(Switch: Boolean; hMainProg: HWnd) Export; Stdcall;
Begin
 If Switch = True Then
   Begin
     GlobalData^.SysHook := SetWindowsHookEx(WH_SHELL, @HookProc, HInstance, 0);
     {...}
   end
 Else
   Begin
     UnHookWindowsHookEx(GlobalData^.SysHook);
     {...}
   end;
end;

Где функция-фильтр имеет вид:
Function HookProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT; Stdcall;
Begin
 If Code = HSHELL_WINDOWCREATED Then
   SendMessage(GlobalData^.MyAppWnd, WM_MYMESS, WParam, LParam);
 Result := CallNextHookEx(GlobalData^.SysHook, Code, WParam, LParam);
End;


В самой программе делаю:
Procedure TForm1.WndProc(Var Msg: TMessage);
Begin
 Inherited;
 If Msg.Msg = WM_MYMESS Then
   Begin
     {Просто записываю handle новосозданного окна}
     ListBox1.Items.Insert(0, IntToStr(Msg.WParam));
   End;
End;


Вроде бы всё делал правильно, но у процессов, запускающих окна, а потом и в моей программе (или в Delphi, если запускаю из-под неё) возникает сообщение "Память не может быть Read", а за ним, если правильно помню, AV. Откомпилировал 3-й пример из статьи, думал, я что-то не так "подправил", так он тоже как-то не очень стабильно работает, тоже эти ошибки выдаёт. Систему DEP отключил полностью, вычитав, что она такие ошибки может провоцировать. Подскажите, что я не так делаю, может, где какая ошибка проскочила?


 
Eraser ©   (2008-07-16 21:56) [1]

на сколько помню в примере хука на этом сайте какие-то ошибки, какие - не помню.


 
SergeyIT ©   (2008-07-16 23:35) [2]

Вероятно GlobalData^ в процессах недоступрно.


 
SergeyIT ©   (2008-07-16 23:36) [3]

Проверьте GlobalData^ на nil


 
MikeZ   (2008-07-17 08:31) [4]

Да, все проверки есть (и в статье тоже): GlobalData не nil. Иначе, кстати, не было бы передачи handle нового окна в программу:
SendMessage(GlobalData^.MyAppWnd, WM_MYMESS, WParam, LParam);
А передача такая есть, т.е. тут всё в порядке.


 
Сергей М. ©   (2008-07-17 08:43) [5]


> в моей программе


> а за ним, если правильно помню, AV


Если так, то можно воспользоваться встроенным отладчиком, для детального поиска "неисправности".

Изучи стандартный справочный материал по теме назначения пункта IDE-меню "Run|Parameters"


 
SergeyIT ©   (2008-07-17 09:28) [6]


> WParam: WParam; LParam: LParam

Нехорошо переменные именовать как типы


 
Rouse_ ©   (2008-07-17 09:38) [7]

В библиотеке из примера нужно убрать STDCALL у procedure DLLEntryPoint.


> Нехорошо переменные именовать как типы

Пиши в Microsoft, пусть срочно переписывают MSDN :)

LRESULT CALLBACK ShellProc(          int nCode,
   WPARAM wParam,
   LPARAM lParam
);


 
SergeyIT ©   (2008-07-17 09:41) [8]

В С учитывается регистр, поэтому WPARAM <> wParam


 
Rouse_ ©   (2008-07-17 09:44) [9]

А в дельфи учитывается тип, а не его наименование, поэтому LParam <> LParam :)


 
Сергей М. ©   (2008-07-17 10:39) [10]

Ну и IsMultiThread=True при инициализации библиотеки будет явно не лишним (в примерах отсутствует), если используется потоконебезопасный менеджер памяти


 
MikeZ   (2008-07-17 15:23) [11]

Rouse_
Да, это именно оно и было! Большое спасибо!
(в ту степь вообще не смотрел :( )

Сергей М.
Тоже спасибо!



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
6-1192402936
Hero
2007-10-15 03:02
2008.08.24
передача видео


15-1215157270
Gleb
2008-07-04 11:41
2008.08.24
Есть работа


2-1216282915
Артур Пирожков
2008-07-17 12:21
2008.08.24
Проблемы с Tidftp


13-1120547588
Игорь Шевченко
2005-07-05 11:13
2008.08.24
Социологический опрос: нужен ли отдельный форум по .Net ?


4-1195028705
DelphiN!
2007-11-14 11:25
2008.08.24
Access denied при выполнении OpenProcess