Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funktion? (https://www.delphipraxis.net/110768-dll-wie-glob-variablenzugr-innhlb-zeigeruebergeb-funktion.html)

Delphi-Laie 24. Mär 2008 14:51


DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funktion?
 
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:

Delphi-Quellcode:
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.

Delphi-Laie 29. Mär 2008 12:49

Re: DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funkt
 
Im delphi-forum(.de) wurde die wahrscheinliche Lösung des Problems genannt: Das Problem ist vermutlich nicht der gezeigerte, sondern der hookinitiierte Aufruf der betreffenden Routinen. Letzteres hatte ich naiverweise gar nicht für so wesentlich erachtet.

Für die Allgemeinheit will ich hier das Rätsel aber nicht ungelöst lassen, deshalb teile ich das mit.

Also, Leute, laßt, solang es irgendwie geht, die Finger von API (fast noch harmlos), DLLs (schon ein Quentchen schlimmer) und ganz speziell von Hooks (die sind das anscheinend allerschlimmste (oder gibt es dazu noch eine Steigerung?), denn man muß mit allerlei unbekannten, mit den bisherigen Delphi-Erfahrungen nicht konformen, nicht erklärbaren Auswirkungen rechnen: Nicht alle Vorstellungen lassen sich deshalb damit auch realisieren). Das Umgehen dieser Ekelhaftigkeiten ist natürlich nicht immer möglich.

Ich bekomme mein Problem, wie schon erwähnt, über den (lesenden) Zugriff auf Dateien gelöst - nicht allzu elegant, aber es funktioniert stabil (z.Z. noch, und zwar unter Win200, wer weiß, wie es unter anderen Windows- und Dateisystemversionen aussieht).


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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