Hallo, liebe Delphifreunde!
Eine ähnliche Anfrage (inzwischen habe ich die Sache weiter analysiert) blieb im Delphi-Forum(.de) bisher leider unbeantwortet, deshalb wende ich mich erstmalig jetzt vertrauensvoll und hilfeerbittend an Euch.
Es geht um die hookinitiierte Enumeration aller ChildWindows eines ParentWindows in einer
DLL, die im Prinzip ja wie folgt abläuft (und bei mir auch durchaus funktioniert):
Delphi-Quellcode:
var a:array[1..30] of byte;
function EnumChildProc(Wnd:hWnd;LParam:Longint):Bool;stdcall;
begin
Result:=Wnd<>0;
if Result<>0 then
begin
{mein Code}
end;
EnumChildWindows(Wnd,@EnumChildProc,0) //rekursiver Aufruf
end;
function HookProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall
var ParentWindowHandle:THandle;
begin
Result:=CallNextHookEx(HookHandle,nCode,wParam,lParam);
case nCode < 0 of
TRUE: exit;
FALSE:begin
{mein Code}
end;
ParentWindowHandle:=GetForegroundWindow;
EnumChildWindows(ParentWindowHandle,@EnumChildProc,0) //Erstaufruf
end;
HookHandle:=SetWindowsHookEx(WH_CBT, @HookProc, HInstance, 0)
Mein Problem ist, daß ich inerhalb der per Zeiger aufgerufenen Funktion "EnumChildProc" und "HookProc" zwar auf das global definierte Array a zugreifen kann, diese übergebenen Werte jedoch nicht stimmen. Es kommt noch kurioser: Rufe ich die HookProc
ohne Zeiger auf:
HookHandle:=SetWindowsHookEx(WH_CBT, HookProc, HInstance, 0)
, dann funktioniert das
erstaunlicherweise auch, jedoch stimmen auch dann die in dieser Funktion erhältlichen Werte des Arrays nicht. Rufe ich die Funktion HookProc jedoch explizit, also nicht als Argument auf, dann stimmen dort die Werte des a-Arrays.
Außerhalb dieser beiden Funktionen, jedenfalls in explizit und ohne Zeiger aufgerufenen Funktionen und Prozeduren der
DLL sind die korrekten Werte jedoch verfügbar.
Weiß jemand, warum die globalen Variablen dort nicht verfügbar sind und wie man irgendwie (globale) Variablen, Daten in diese Funktionen einschleusen kann? Ein lesender Zugriff würde mir schon reichen.
Ich habe auch schon versucht, über Dateioparationen diese Werte abzurufen. Bei Zugriff auf festplattengespeicherte Dateien stürzt der Explorer ab (wohl zu viele Operationen pro Zeiteinheit, verkraftet der wohl nicht?); bei Ramdiskgespeicherten Dateien stürzt der Explorer zwar nicht ab, aber das Programm ist immer noch viel zu langsam.
Versucht habe ich auch schon einiges in Richtung der Zeiger aus der guten alten Turbo-Pascal-Zeit (mit dem ^-Zeichen), jedoch alles erfolglos.
Besten Dank für Eure Aufmerksamkeit und Euer Bemühen!
Netter Gruß
Delphi-Laie
Postscriptum: Die Showmessagefunktion funktioniert in den beiden genannten Funktionen übrigens auch nicht, und zwar mit der Folge des Totalabsturzes (!) von Windows.