![]() |
Kleine Verständnisfrage zu globalen Hooks
Hallo,
Ich versuche mich gerade an einem globalen Hook. Bin jetzt allerdings etwas verwirrt. Habe eine DLL mit der Callback-Funktion für den Hook, die von der DLL auch exportiert wird. Mein erster Versuch war nun folgender. Ich rufe in meiner Anwendung auf:
Delphi-Quellcode:
Das scheint auch prinzipiell zu funktionieren. Die DLL wird nun von jedem Prozess geladen und die Callback-Funktion wird ausgeführt.
// FDLLInst = hInstance von DLL (über LoadLibrary erhalten)
// FDLLHookProc = Zeiger auf die Callback-Funktion (über GetProcAddress erhalten) FHook := SetWindowsHookEx(WH_GETMESSAGE,FDLLHookProc,FDLLInst,0); Wenn ich jetzt den Hook aus dem Hauptprogramm raus deinstallieren will:
Delphi-Quellcode:
dann fängt Windows ziemlich an zu taumeln und letztendlich verabschiedet sich der Window-Manager.
if FHook <> 0 then
UnHookWindowsHookEx(FHook); Habe jetzt rausgefunden, dass ich wohl scheinbar (?) SetWindowsHookEx und UnHookWindowsHookEx in jedem Prozess (also in der DLL) aufrufen muss. Dazu exportiert die DLL in den von mir gelesenen Tutorials Funktionen (InstallHook, UnInstallHook). Aber wie funktioniert das denn dann? Ich lade die DLL mit meinem Programm und rufe InstallHook auf. Die DLL ruft nun SetWindowsHookEx auf. Aber habe ich dann nicht nur einen lokalen Hook in meinem Prozess? Wie installieren jetzt die anderen Prozesse den Hook? Also da fehlt mir irgendwie noch ein Stück Verständnis :( Kann mich da vllt. kurz jemand aufklären? Gruß Neutral General |
AW: Kleine Verständnisfrage zu globalen Hooks
Zitat:
Aber inwieweit kommt Windows ins Taumeln? Haste Details? |
AW: Kleine Verständnisfrage zu globalen Hooks
Also Windows wird unbedienbar.. Zuerst hakt die Maus und dann geht irgendwann meistens gar nichts mehr. Wenn man Glück hat kommt der Dialog dass der Window Manager nicht mehr funktioniert und man kann dann noch auf den "Schließen" Button klicken bevor alles zusammenbricht. Wenn man das geschafft hat, dann normalisiert sich wieder alles.
Jetzt habe ich mein Programm mit meiner DLL mal in einer VM (Win XP) getestet und dort meckerte meine Anwendung zuerst, dass die Datei "borlndmm.dll" fehlen würde. Das Programm startete aber dennoch. Der Hook wird aber nicht erfolgreich installiert. Jetzt habe ich diese DLL in die VM kopiert und der Hook wird installiert. Allerdings taucht dann auch der oben beschriebene Effekt auf. Mein Code (DLL):
Delphi-Quellcode:
Programm (Ausschnitt):
library HookDLL;
uses ShareMem, Windows, SysUtils, Classes; {$R *.res} var FHook: HHOOK; function HookProc(code: Integer; wParam: Cardinal; lParam: Cardinal): Cardinal; stdcall; begin if code < HC_ACTION then Result := CallNextHookEx(FHook,code,wParam,lParam) else begin // Code Result := CallNextHookEx(FHook,code,wParam,lParam); end; end; procedure InstallHook; stdcall; begin FHook := SetWindowsHookEx(WH_GETMESSAGE,@HookProc,hInstance,0); // Nur zu Testzwecken: if FHook <> 0 then MessageBox(0,'Installiert!','Test123',0); end; procedure UnInstallHook; stdcall; begin if FHook <> 0 then UnhookWindowsHookEx(FHook); end; exports InstallHook, UnInstallHook, HookProc; begin end.
Delphi-Quellcode:
Ok, ich habe vllt. grade eine Vermutung. Könnte es sein, dass das Problem darin liegt, dass FHook in den Instanzen in anderen Prozessen immer 0 ist und dann zu Fehlern führt?
procedure TForm1.FormCreate(Sender: TObject);
var lib: hModule; begin FHookInst := LoadLibrary('HookDLL.dll'); if (FHookInst <> 0) then begin FHookInstall := GetProcAddress(FHookInst,'InstallHook'); FHookUnInstall := GetProcAddress(FHookInst,'UnInstallHook'); end; end; procedure TForm1.Button2Click(Sender: TObject); begin if Assigned(FHookInstall) then FHookInstall; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FHookUnInstall) then FHookUnInstall; end; PS: Hatte dein Tutorial gelesen, aber dachte man könnte evtl. auch mal zu Testzwecken einen Minimal-Hook ohne MMF (allg. IPC) zum laufen bekommen... |
AW: Kleine Verständnisfrage zu globalen Hooks
Zitat:
|
AW: Kleine Verständnisfrage zu globalen Hooks
Hab jetzt mal im HookProc um alles die Bedingung
Delphi-Quellcode:
if FHook <> 0 then
gesetzt. Und im UnInstallHook wurde ja auch eigentlich abgefragt ob FHook <> 0 ist. So wirklich verstehe ich immer noch nicht warum beim UnInstallHook mein Windows so in die Knie geht, dass es manchmal sogar den Geist aufgibt :? |
AW: Kleine Verständnisfrage zu globalen Hooks
Das Problem taucht auch in XP auf oder nur auf "neueren" Windowsversionen?
|
AW: Kleine Verständnisfrage zu globalen Hooks
Auf meinem PC ist Windows Vista. Da tauchts auf und in meiner XP-VM auch. Wobei sich XP von dem Schock meistens besser erholt als Vista...
|
AW: Kleine Verständnisfrage zu globalen Hooks
Zitat:
Wenn du jetzt in HookProc prüfst ob "FHook <> 0" ist müsste man davon ausgehen das nicht initialisierte globale Variable automatisch auf 0 gesetzt werden. Zudem frage ich mich wie du dann CallNextHookEx aufrufst - ich hoffe doch du rufst es auf und lässt den Aufruf nicht ganz weg?! :) |
AW: Kleine Verständnisfrage zu globalen Hooks
Hallo,
Ja doch ich rufe CallNextHook dann gar nicht auf. Aber das Problem taucht ja irgendwie auch erst auf, wenn ich den Hook deinstallieren will. Mein Code:
Delphi-Quellcode:
function HookProc(code: Integer; wParam: Cardinal; lParam: Cardinal): Cardinal; stdcall;
begin if FHook <> 0 then begin if code < HC_ACTION then Result := CallNextHookEx(FHook,code,wParam,lParam) else begin // Code Result := CallNextHookEx(FHook,code,wParam,lParam); end; end else Result := 0; end; |
AW: Kleine Verständnisfrage zu globalen Hooks
Hast du mal geschaut ob FHook auch wirklich 0 ist wenn es nicht initialisiert wurde? Wenn nicht (bzw. aus gutem Stil) solltest du die globale Variable auch initialisieren und nicht darauf vertrauen das diese den richtigen Wert hat.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz