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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.053 c
2-1216705735
Vlad Oshin
2008-07-22 09:48
2008.08.24
Смотрел DB.pas (BDS2006). Не понял.


4-1195300824
NX
2007-11-17 15:00
2008.08.24
Не освобождается мьютех, почему?


3-1204215439
slimer
2008-02-28 19:17
2008.08.24
Обрыв соединения с MySQL сервером


15-1215162423
DN
2008-07-04 13:07
2008.08.24
Что за кодировка?


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский