Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frage bzgl. HookHandle und DLL (https://www.delphipraxis.net/87403-frage-bzgl-hookhandle-und-dll.html)

Chris P 28. Feb 2007 09:56


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:
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;
Danke schonmal im Voraus...

Robert Marquardt 28. Feb 2007 12:22

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 http://cc.codegear.com/Item/15387 das die DLL nachtraeglich patcht.
Alternativ kann man die Variable in einem Memory Mapped File unterbringen (Stichwort MapViewOfFile).

Chris P 28. Feb 2007 12:27

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.

Robert Marquardt 28. Feb 2007 12:46

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.

Chris P 28. Feb 2007 12:56

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.

Robert Marquardt 28. Feb 2007 13:04

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.

Chris P 28. Feb 2007 13:17

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.

Robert Marquardt 28. Feb 2007 13:31

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.

Chris P 28. Feb 2007 13:44

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 17:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz