Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Hook führt zu System Exception

  Alt 24. Mai 2011, 14:13
Delphi-Version: XE
Ich habe gerade echt ein nettes Problem und habe keine Ahnung, warum dieses Problem auftritt. Ich habe ewig gebraucht um den Fehler zu finden, da er verzögert auftritt -- ich glaube, dass es zu dem Zeitpunkt statt findet, zum der Hook auf die erste Nachricht reagieren soll. So registriere ich den Hook:
Delphi-Quellcode:
procedure TMyHook.InstallMessageHook();
var
  Method: TMethod;
begin
  if (FHookHandle <> 0) then
    raise Exception.Create('Hook is already installed. Please uninstall hook first.');
  Method.Code := @TMyHook.HookProc;
  Method.Data := Self;
  FHookMethodPointer := MakeProcInstance(Method);
  FHookHandle := SetWindowsHookEx(WH_CALLWNDPROC, FHookMethodPointer, 0, GetCurrentThreadId());
  if (FHookHandle = 0) then
    RaiseLastOSError();
end;

function TMyHook.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var
  P: PCWPStruct;
begin
  case nCode < HC_ACTION of
    True:
      Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
  else
    if (lParam <> 0) and (Assigned(FParentForm)) and (Assigned(FChildForm)) then
    begin
      P := PCWPStruct(lParam);
      if (P.message in [WM_WINDOWPOSCHANGING, SW_MAXIMIZE, SW_MINIMIZE]) and (P.hwnd = FParentForm.Handle) then
        ReadjustChildForm();
    end;
    Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
  end;
end;
Ist daran schon etwas falsch? Ich sehe jedenfalls kein Problem. Wenn ich das Programm jedenfalls ausführe, dann endet es irgendwann in einer system exception und ich lande im CPU-Fenster der IDE. Ich glaube, dass das Problem mit WH_CALLWNDPROC zusammenhängt. Komisch ist aber, dass es früher funktioniert hat
Code:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Users\Armin\Documents\RAD Studio\Projekte\tmp\HookDemo\Project1.exe trat ein Problem mit folgender Meldung auf: 'system exception (code 0xc000041d) at 0x72a64cad'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  
---------------------------
Vielleicht kennt jemand das Problem ja, oder hat Ideen -- ich bin um jede froh!

-- Edit: Anbei mal eine Demo.
Angehängte Dateien
Dateityp: rar HookDemo.rar (85,2 KB, 13x aufgerufen)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (24. Mai 2011 um 14:20 Uhr)
  Mit Zitat antworten Zitat