AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Kleine Verständnisfrage zu globalen Hooks
Thema durchsuchen
Ansicht
Themen-Optionen

Kleine Verständnisfrage zu globalen Hooks

Ein Thema von Neutral General · begonnen am 18. Jan 2011 · letzter Beitrag vom 18. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 10:24
Hallo,

Ich versuche mich gerade an einem globalen Hook. Bin jetzt allerdings etwas verwirrt.

Habe eine DLL mit der Callback-Funktion für den Hook, die von der DLL auch exportiert wird.
Mein erster Versuch war nun folgender. Ich rufe in meiner Anwendung auf:

Delphi-Quellcode:
// FDLLInst = hInstance von DLL (über LoadLibrary erhalten)
// FDLLHookProc = Zeiger auf die Callback-Funktion (über GetProcAddress erhalten)
FHook := SetWindowsHookEx(WH_GETMESSAGE,FDLLHookProc,FDLLInst,0);
Das scheint auch prinzipiell zu funktionieren. Die DLL wird nun von jedem Prozess geladen und die Callback-Funktion wird ausgeführt.

Wenn ich jetzt den Hook aus dem Hauptprogramm raus deinstallieren will:

Delphi-Quellcode:
if FHook <> 0 then
  UnHookWindowsHookEx(FHook);
dann fängt Windows ziemlich an zu taumeln und letztendlich verabschiedet sich der Window-Manager.
Habe jetzt rausgefunden, dass ich wohl scheinbar (?) SetWindowsHookEx und UnHookWindowsHookEx in jedem Prozess (also in der DLL) aufrufen muss. Dazu exportiert die DLL in den von mir gelesenen Tutorials Funktionen (InstallHook, UnInstallHook).

Aber wie funktioniert das denn dann?
Ich lade die DLL mit meinem Programm und rufe InstallHook auf. Die DLL ruft nun SetWindowsHookEx auf. Aber habe ich dann nicht nur einen lokalen Hook in meinem Prozess? Wie installieren jetzt die anderen Prozesse den Hook?

Also da fehlt mir irgendwie noch ein Stück Verständnis
Kann mich da vllt. kurz jemand aufklären?

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#2

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 11:21
Habe jetzt rausgefunden, dass ich wohl scheinbar (?) SetWindowsHookEx und UnHookWindowsHookEx in jedem Prozess (also in der DLL) aufrufen muss.
Das übernimmt Windows für dich. Sprich, genau dies ist bereits in SetWindowsHookEx implementiert. Das ist auch der Grund warum globale Hooks in einer DLL liegen müssen, damit die anderen Prozesse auf den Code zugreifen können, der im Hook benutzt werden soll.

Aber inwieweit kommt Windows ins Taumeln? Haste Details?
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 11:32
Also Windows wird unbedienbar.. Zuerst hakt die Maus und dann geht irgendwann meistens gar nichts mehr. Wenn man Glück hat kommt der Dialog dass der Window Manager nicht mehr funktioniert und man kann dann noch auf den "Schließen" Button klicken bevor alles zusammenbricht. Wenn man das geschafft hat, dann normalisiert sich wieder alles.

Jetzt habe ich mein Programm mit meiner DLL mal in einer VM (Win XP) getestet und dort meckerte meine Anwendung zuerst, dass die Datei "borlndmm.dll" fehlen würde. Das Programm startete aber dennoch. Der Hook wird aber nicht erfolgreich installiert. Jetzt habe ich diese DLL in die VM kopiert und der Hook wird installiert. Allerdings taucht dann auch der oben beschriebene Effekt auf.

Mein Code (DLL):

Delphi-Quellcode:
library HookDLL;

uses
  ShareMem,
  Windows,
  SysUtils,
  Classes;

{$R *.res}

var
  FHook: HHOOK;

function HookProc(code: Integer; wParam: Cardinal; lParam: Cardinal): Cardinal; stdcall;
begin
  if code < HC_ACTION then
    Result := CallNextHookEx(FHook,code,wParam,lParam)
  else
  begin
    // Code
    Result := CallNextHookEx(FHook,code,wParam,lParam);
  end;
end;

procedure InstallHook; stdcall;
begin
  FHook := SetWindowsHookEx(WH_GETMESSAGE,@HookProc,hInstance,0);
  // Nur zu Testzwecken:
  if FHook <> 0 then
    MessageBox(0,'Installiert!','Test123',0);
end;

procedure UnInstallHook; stdcall;
begin
  if FHook <> 0 then
    UnhookWindowsHookEx(FHook);
end;

exports
  InstallHook,
  UnInstallHook,
  HookProc;

begin

end.
Programm (Ausschnitt):

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var lib: hModule;
begin
  FHookInst := LoadLibrary('HookDLL.dll');
  if (FHookInst <> 0) then
  begin
    FHookInstall := GetProcAddress(FHookInst,'InstallHook');
    FHookUnInstall := GetProcAddress(FHookInst,'UnInstallHook');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(FHookInstall) then
    FHookInstall;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(FHookUnInstall) then
    FHookUnInstall;
end;
Ok, ich habe vllt. grade eine Vermutung. Könnte es sein, dass das Problem darin liegt, dass FHook in den Instanzen in anderen Prozessen immer 0 ist und dann zu Fehlern führt?

PS: Hatte dein Tutorial gelesen, aber dachte man könnte evtl. auch mal zu Testzwecken einen Minimal-Hook ohne MMF (allg. IPC) zum laufen bekommen...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 12:01
PS: Hatte dein Tutorial gelesen, aber dachte man könnte evtl. auch mal zu Testzwecken einen Minimal-Hook ohne MMF (allg. IPC) zum laufen bekommen...
Dann dürfte aber jede Instanz der DLL ihre eigene Kopie von FHook bekommen.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 12:06
Hab jetzt mal im HookProc um alles die Bedingung

if FHook <> 0 then
gesetzt. Und im UnInstallHook wurde ja auch eigentlich abgefragt ob FHook <> 0 ist.
So wirklich verstehe ich immer noch nicht warum beim UnInstallHook mein Windows so in die Knie geht, dass es manchmal sogar den Geist aufgibt
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 12:10
Das Problem taucht auch in XP auf oder nur auf "neueren" Windowsversionen?
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 12:12
Auf meinem PC ist Windows Vista. Da tauchts auf und in meiner XP-VM auch. Wobei sich XP von dem Schock meistens besser erholt als Vista...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 12:58
Hab jetzt mal im HookProc um alles die Bedingung

if FHook <> 0 then
gesetzt.
Was hast du da genau gemacht? Kannst du mal den Quelltext posten. Bei deinem ursprünglichem Quelltext ist klar das irgend etwas abrauchen kann weil du mit FHook arbeitest obwohl es nicht initialisiert ist (ist nur in der Instanz initialisiert die für die du installHook aufrufst).

Wenn du jetzt in HookProc prüfst ob "FHook <> 0" ist müsste man davon ausgehen das nicht initialisierte globale Variable automatisch auf 0 gesetzt werden. Zudem frage ich mich wie du dann CallNextHookEx aufrufst - ich hoffe doch du rufst es auf und lässt den Aufruf nicht ganz weg?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 13:02
Hallo,

Ja doch ich rufe CallNextHook dann gar nicht auf. Aber das Problem taucht ja irgendwie auch erst auf, wenn ich den Hook deinstallieren will.

Mein Code:

Delphi-Quellcode:
function HookProc(code: Integer; wParam: Cardinal; lParam: Cardinal): Cardinal; stdcall;
begin
  if FHook <> 0 then
  begin
    if code < HC_ACTION then
      Result := CallNextHookEx(FHook,code,wParam,lParam)
    else
    begin
      // Code
      Result := CallNextHookEx(FHook,code,wParam,lParam);
    end;
  end
  else
    Result := 0;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

AW: Kleine Verständnisfrage zu globalen Hooks

  Alt 18. Jan 2011, 13:16
Hast du mal geschaut ob FHook auch wirklich 0 ist wenn es nicht initialisiert wurde? Wenn nicht (bzw. aus gutem Stil) solltest du die globale Variable auch initialisieren und nicht darauf vertrauen das diese den richtigen Wert hat.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:55 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