Конференция "Начинающим" » Hooks: память не может быть read. [D7, WinXP]
 
  • MikeZ (16.07.08 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 © (16.07.08 21:56) [1]
    на сколько помню в примере хука на этом сайте какие-то ошибки, какие - не помню.
  • SergeyIT © (16.07.08 23:35) [2]
    Вероятно GlobalData^ в процессах недоступрно.
  • SergeyIT © (16.07.08 23:36) [3]
    Проверьте GlobalData^ на nil
  • MikeZ (17.07.08 08:31) [4]
    Да, все проверки есть (и в статье тоже): GlobalData не nil. Иначе, кстати, не было бы передачи handle нового окна в программу:
    SendMessage(GlobalData^.MyAppWnd, WM_MYMESS, WParam, LParam);


    А передача такая есть, т.е. тут всё в порядке.
  • Сергей М. © (17.07.08 08:43) [5]

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


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


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

    Изучи стандартный справочный материал по теме назначения пункта IDE-меню "Run|Parameters"
  • SergeyIT © (17.07.08 09:28) [6]

    > WParam: WParam; LParam: LParam

    Нехорошо переменные именовать как типы
  • Rouse_ © (17.07.08 09:38) [7]
    В библиотеке из примера нужно убрать STDCALL у procedure DLLEntryPoint.


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

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

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

  • SergeyIT © (17.07.08 09:41) [8]
    В С учитывается регистр, поэтому WPARAM <> wParam
  • Rouse_ © (17.07.08 09:44) [9]
    А в дельфи учитывается тип, а не его наименование, поэтому LParam <> LParam :)
 
Конференция "Начинающим" » Hooks: память не может быть read. [D7, WinXP]
Есть новые Нет новых   [134435   +35][b:0][p:0.001]