AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Hooks

Ein Thema von golisan · begonnen am 10. Jul 2012 · letzter Beitrag vom 13. Jul 2012
Antwort Antwort
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#1

Mehrere Hooks

  Alt 10. Jul 2012, 09:16
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Mehrere Hooks

  Alt 10. Jul 2012, 13:35
[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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Mehrere Hooks

  Alt 10. Jul 2012, 17:01
Wie sehen deine Hook Callbacks denn aus?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Mehrere Hooks

  Alt 11. Jul 2012, 23:51
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Mehrere Hooks

  Alt 12. Jul 2012, 15:26
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Mehrere Hooks

  Alt 13. Jul 2012, 10:59
Hallo,

danke für eure Antworten aber das Problem lag zwischen meinen Ohren
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. (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...
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Mehrere Hooks

  Alt 13. Jul 2012, 11:06
Outputdebugstring ?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Mehrere Hooks

  Alt 13. Jul 2012, 14:06
OutputDebugString?
Habe ich noch nie gehört, werde ich aber mal ausprobieren
Danke Bummi
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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