AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funktion?
Thema durchsuchen
Ansicht
Themen-Optionen

DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funktion?

Ein Thema von Delphi-Laie · begonnen am 24. Mär 2008 · letzter Beitrag vom 29. Mär 2008
Antwort Antwort
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funktion?

  Alt 24. Mär 2008, 14:51
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

Re: DLL: Wie glob.Variablenzugr. innhlb. zeigerübergeb.Funkt

  Alt 29. Mär 2008, 12:49
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).
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:46 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