![]() |
Frage bzgl. HookHandle und DLL
Hi Leute,
ich habe folgende Frage zu einem HookHandle und einer DLL: Man hat ein Hauptprogramm und eine DLL in der ein Keyboardhook implementiert ist. Nun wird ja aus dem Hauptprogramm heraus der Hook installiert mittels SetWindowsHook(...) Der Rückgabewert ist das HookHandle. Also wird ja das Handle nur in der DLL-Kopie des Hauptprogramms gesetzt. Jetzt greift aber CallNextHookEx(...) in der Hook-Proc auf das Handle zu. Wenn dies nun von einer anderen DLL-Kopie erfolgt ist das Handle ja immer 0, da es eine globale Variable ist. Wie funktioniert es dann, dass der nächste Hook korrekt ausgeführt wird? Hier nochmal der Quelltext aus der DLL:
Delphi-Quellcode:
Danke schonmal im Voraus...
var
hHook: LongWord = 0; // <--- globales HookHandle function HookProc(Code: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall; begin Result := CallNextHookEx(hHook, Code, wParam, lParam); [...] end; function SetHook(): Boolean; stdcall; begin if ( hHook = 0 ) then begin // HookHandle wird nur von Hauptprogramm gesetzt hHook := SetWindowsHookEx(WH_KEYBOARD, @HookProc, hInstance, 0); end; Result := hHook <> 0; end; |
Re: Frage bzgl. HookHandle und DLL
Beim Microsoft-Compiler kann man recht leicht die globale Variable in ein shared segment bugsieren das dann global in allen DLL-Kopien ist.
Dazu gibt es ein Tool von Petr Vones ![]() Alternativ kann man die Variable in einem Memory Mapped File unterbringen (Stichwort MapViewOfFile). |
Re: Frage bzgl. HookHandle und DLL
Memory Mapped Files sind mir bekannt.
Mich wundert es nur warum der nächste Hook in der Hookchain fehlerfrei aufgerufen wird, obwohl keine MMFs oder sharedmem benutzt wird. |
Re: Frage bzgl. HookHandle und DLL
Ah, ich hatte heute schon zu viele Deppenfragen. Da habe ich nicht bis zur interessanten Frage gelesen.
Soweit ich das verstehe ist das nicht zum Weiterreichen an die naechste DLL-Instanz sondern zum Weiterreichen an den naechsten fremden Hook. Es kann gut sein das dein Hook der einzige ist, dann faellt es nicht auf das es nicht funktioniert. |
Re: Frage bzgl. HookHandle und DLL
Doch doch es funktioniert ja, z.B. wird ein Tastenanschlag zuerst an mein Programm geschickt und dann korrekt an das Zielfenster, wie z.B. Word oder an den Editor.
|
Re: Frage bzgl. HookHandle und DLL
Wird der Message wirklich ueber den Hook versandt. Da liegt wahrscheinlich der Irrtum. Es wird vermutlich die Message erst ueber die Hooks geschickt und geht dann normal mit PostMessage ans Fenster.
|
Re: Frage bzgl. HookHandle und DLL
Die DLL verarbeitet die Nachrichten selbst und schickt nichts via Postmessage an mein Hauptprogramm.
Das Hauptpogramm installiert nur den Hook. Seltsam ist, wenn ich CallNextHookEx nicht aufrufe, wird auch nichts an Word oder an andere weitergeleitet. |
Re: Frage bzgl. HookHandle und DLL
Ich meinte nicht dein Programm, sondern wie die Messageverarbeitung in Windows wohl funktioniert. Irgendwann wird dort ja die Message mit PostMessage in die Messagequeue von z. B. Word gestellt.
Es kann sein das XP die Hookchain auch ohne Hook-Handle hinkriegt. Spar doch mal die Variable ein und nimm immer 0 als HHook-Wert. Das sollte aber nicht in einer Auslieferungsversion des Programmes bleiben. Es kann ja sein das Win 2000 oder 98 es nicht hinkriegen. |
Re: Frage bzgl. HookHandle und DLL
Ich habe jetzt mal im PSDK nachgelesen.
Also CallNextHookEx(...) bewirkt ja, das die Nachrichten an alle installierten Hooks anderer Programme weiterschickt wird. In meinem Fall ist das Hookhandle = 0, außer in der DLL der Anwendung, und wenn das Hookhandle gleich 0 ist, wird die Nachricht gleich an das Zielfenster geschickt. Danke Robert für deine Hilfe ... ich denke jetzt habe ich es verstanden! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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-2025 by Thomas Breitkreuz