Einzelnen Beitrag anzeigen

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, 10: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