[Delphi] WH_JOURNALRECORD Hook

Pagina: 1
Acties:

  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Ik probeer een WH_JOURNALRECORD Hook te gebruiken. Ik heb hiervoor al verschillende voorbeelden gezien.
Het installeren van de hook doe ik zo:

code:
1
hJournalHook := SetWindowsHookEx(WH_JOURNALRECORD, @CallBackJournalRecHook, HInstance , 0);

Hier gaat het meteen mis. Het systeem hangt meteen. Ik kan alleen nog CTRL-ALT-DEL gebruiken en de taskmanager starten. Verder reageert Windows 2000 nergens meer op. Pas na ongeveer een minuut, gaat het verder en kom ik zelfs op een breakpoint in de Callbackfunctie. Als ik vervolgens weer verder 'RUN' lijkt alles goed te gaan. Echter wordt de Callback niet meer aangeroepen.

Heeft iemand ervaring met het gebruik van Hooks? Ik heb al veel gelezen (via google) maar nog niet de oplossing gevonden. Het lijkt of ik het wel goed doe.
Wie heeft er tips.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Is dit code in een DLL of een EXE?

We adore chaos because we like to restore order - M.C. Escher


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
In een DLL.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
library JournalRecHook;

uses  Windows,  Messages;

const
  CM_JOURNAL_RECEIVED = WM_USER + $1000;

var
  hJournalHook  : HHook;

{This is the CallBack function called by the Hook}
function CallBackJournalRecHook( Code    : Integer; wParam  : WPARAM;
                           lParam  : LPARAM ) : LRESULT; stdcall;
begin
  if code=HC_ACTION then
  begin
    PostMessage(HWND_BROADCAST,CM_JOURNAL_RECEIVED,wParam,lParam);
  end;
  Result := CallNextHookEx(hJournalHook, Code, wParam, lParam)
end;

{procedure for install the hook}
procedure HookOnRec; stdcall;
begin
   hJournalHook := SetWindowsHookEx(WH_JOURNALRECORD, @CallBackJournalRecHook, HInstance , 0);
end;

procedure HookOffRec;  stdcall;
begin
   UnhookWindowsHookEx(hJournalHook);
end;

exports
 HookOnRec,
 HookOffRec;

begin
end.


Dit is de hele dll code. Ik hebhet ook al in een exe geprobeerd. Levert zelfde probleem op.
Ik weet dat de DLL nu nog niks zinnigs doet. Maar hij moet het eerst gewoon doen.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dus je wilt een global hook? Vervang dan HInstance met nil en probeer het nog eens

We adore chaos because we like to restore order - M.C. Escher


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Als ik voor HInstance nil invul, wordt er geen hook geinstalleerd.
SetWindowsHookEx returned 0.

Als het systeem vast loopt, is het niet zo dat het systeem na een poosje weer verder gaat, zoals ik eerst zei.
Windows reageert pas weer ergens op nadat CTRL-ALT-DEL gebruikt is.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

ok, misschien hoeft een journal hook niet global te zijn. Maar HInstance lijkt me ook niet goed, want dat is in dit geval de handle van de dll. Ik neem aan dat je minstens die van je app moet geven.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

* LordLarry is inmiddels thuis

Nee, dat hInstance is toch goed. Ik heb alleen ervaring met mouse en keyboard hooks, maar ik neem aan dat een journal hook niet heel erg anders is.

Als het een globale hook is wordt de dll bij elk draaiend process ingeladen. Dat betekend dat alle variablen binnen je DLL uniek zijn per process. Dus

var
hJournalHook : HHook;

is voor elke DLL uniek en zal dus alleen bij het process dat de HookOnRec functie aanroepte goed gevuld zijn.

Je moet deze variable globaal zien te maken voor alle instanties van die dll. Dat kan met een memory mapped file. Zie CreateFileMapping en MapViewOfFile.

We adore chaos because we like to restore order - M.C. Escher


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Dit werkt inderdaad.
Thanks!! _/-\o_

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LordLarry schreef op 28 oktober 2002 @ 15:20:
Dus je wilt een global hook? Vervang dan HInstance met nil en probeer het nog eens
Voor een globale hook moet je juist de HModule (zelfde als HInstance overigens) opgeven van de DLL waarin ie zich bevindt:
hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
ps. mocht je problemen hebben met hooks, schroom niet te vragen ik heb er 1 of 2 dingen mee gedaan (zie sig ;) )

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Quitter3 schreef op 28 oktober 2002 @ 15:31:
Als ik voor HInstance nil invul, wordt er geen hook geinstalleerd.
SetWindowsHookEx returned 0.
Logisch, de Journal hooks moeten verplicht global zijn.

Professionele website nodig?

Pagina: 1