![]() |
Mehrere Hooks
Hallo,
ich habe das Problem, dass wenn ich in einer DLL mehrere Hooks installiere, diese dann nicht funktionieren. Installiere ich nur den einen oder den anderen funktioniert es. :? DLL:
Delphi-Quellcode:
In einem Testprogramm starte ich die Hooks so:
function InstallHookProcWnd: HINST; stdcall;
begin Result := 0; try begin if HookHandleMsg = 0 then begin HookHandleMsg := SetWindowsHookEx(WH_CALLWNDPROC, @WndHookProc, HInstance, 0); end else MessageBox(0,'WndHook bereits installiert','Info',0); end; except MessageBox(0,'Wnd-Hook konnte nicht installiert werden!','Info',0); end; Result := hInstance; end; // ---------------------------------------------------------------------- function InstallHookProcMsg: HINST; stdcall; begin Result := 0; try begin if HookHandleMsgC = 0 then begin HookHandleMsgC := SetWindowsHookEx(WH_GETMESSAGE , @GetMsgProc, hInstance, 0); end else MessageBox(0,'Msg-Hook bereits installiert','Info',0); end; except MessageBox(0,'Msg-Hook konnte nicht installiert werden!','Info',0); end; Result := hInstance; end;
Delphi-Quellcode:
Kommentiere ich einen der beiden Funktionsaufrufe aus, tut der aktive Hook was er soll.
procedure TForm1.Button1Click(Sender: TObject);
var InstallHookWnd : TInstallHookWnd; InstallHookMsg : TInstallHookMsg; begin hLibInWnd := LoadLibrary('QsTools.dll'); if hLibInWnd <> 0 then begin @InstallHookWnd := GetProcAddress(hLibInWnd, 'InstallHookProcWnd'); if not Assigned(InstallHookWnd) then exit; end else begin showmessage('Hook nicht installiert'); exit; end; hLibInMsg := LoadLibrary('QsTools.dll'); if hLibInMsg <> 0 then begin @InstallHookMsg := GetProcAddress(hLibInMsg, 'InstallHookProcMsg'); if not Assigned(InstallHookMsg) then exit; end else begin showmessage('Hook nicht installiert'); exit; end; InstallHookMsg; InstallHookWnd; end; Ich brauche zwei Hooks weil ich auf verschiedene Messages reagieren muss. WH_CALLWNDPROC brauche ich um auf WM_INITMENU reagieren zu können. WH_GETMESSAGE brauche ich um auf den Klick eines Menüitems reagieren zu können. Der WM_COMMAND eines Menuitems kommt beim WH_CALLWNDPROC nicht an, weil Menübefehle gepostet und nicht gesendet werden. (deshalb der WH_GETMESSAGE) Ich habe die hInstance-Variable in Verdacht. Da die ja nur einmal vorhanden ist, wird sie durch den zweiten Hook überschrieben. Definiere ich mir selber zwei Variablen und verwende diese, tut sich gar nix! Hat jemand einen Tipp? |
AW: Mehrere Hooks
[quote]
ich habe das Problem, dass wenn ich in einer DLL mehrere Hooks installiere, diese dann nicht funktionieren. {/quote] Und das äußert sich wie? Fehlermeldung etc. ? Welches Ergebnis gibt SetWindowsHookEx jeweils zurück? Hast du dieses eventuell schon ausgewertet? |
AW: Mehrere Hooks
Wie sehen deine Hook Callbacks denn aus?
|
AW: Mehrere Hooks
Ein und dieselbe DLL mehrfach laden ist nicht im Sinne des Erfinders.
Wenn das zwingend sein muss, dann muss die DLL als Datei auch mehrfach vorhanden sein mit unterschiedlichen Namen. |
AW: Mehrere Hooks
Sollte allerdings keinen Unterschied machen. Der zweite Aufruf von LoadLibrary() läd die DLL ja nicht erneut, sondern gibt nur die bestehende ImageBase zurück.
|
AW: Mehrere Hooks
Hallo,
danke für eure Antworten aber das Problem lag zwischen meinen Ohren :lol: Ich hatte mir Variablen per MessageBox ausgegeben und das hatte dazu geführt, dass die Hooks nicht so funktioniert hatten, wie ich das erwartet habe. :oops: (wahrscheinlich weil dadurch die Windows-Messages "durcheinander" kommen...???) Ist aber auch blöd Hooks zu debuggen :? Inzwischen weiß ich, wie man DLLs debuggen kann(Start...Parameter) aber das scheint nicht mit CallBack-Funktionen zu funktionieren, oder? Der Debugger hält auf jeden fall nicht an... |
AW: Mehrere Hooks
Outputdebugstring ?
|
AW: Mehrere Hooks
OutputDebugString?
Habe ich noch nie gehört, werde ich aber mal ausprobieren :stupid: Danke Bummi :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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