Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrere Hooks (https://www.delphipraxis.net/169290-mehrere-hooks.html)

golisan 10. Jul 2012 08:16

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:
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;
In einem Testprogramm starte ich die Hooks so:

Delphi-Quellcode:
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;
Kommentiere ich einen der beiden Funktionsaufrufe aus, tut der aktive Hook was er soll.

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?

SirThornberry 10. Jul 2012 12:35

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?

Zacherl 10. Jul 2012 16:01

AW: Mehrere Hooks
 
Wie sehen deine Hook Callbacks denn aus?

Sir Rufo 11. Jul 2012 22:51

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.

Zacherl 12. Jul 2012 14:26

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.

golisan 13. Jul 2012 09:59

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...

Bummi 13. Jul 2012 10:06

AW: Mehrere Hooks
 
Outputdebugstring ?

golisan 13. Jul 2012 13:06

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 15:58 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