Problem mit DLL & gemeinsamen Variablen
-
Hallo,
ich hab anscheinend irgendwie ein Verständnisproblem was DLLs angeht.
Genauergesagt habe ich einen KeyboardHook (ja wurde hier schon oft diskutiert).
In dieser DLL habe ich den Buffer, der die Zeichen aufnimmt in#pragma data_seg ("Shared") static char Buffer[512] = {0}; HWND hOldForeGroundWin; #pragma data_seg () #pragma comment (linker, "/section:Shared,RWS")definiert.
Der Buffer wird dann wenn er eine best. Länge erreicht hat geschrieben. Es tauchen auch alle Zeichen aus unterschiedlichen Fenstern drin auf, kein Problem.
Nun möchte ich aber noch das Fenster loggen, in welchem der Text eingegeben wird. Deswegen habe ich zusätzlich noch ein HWND im gemeinsamen Bereich angelegt, welches das gerade aktuelle Vordergrundfenster speichen soll.
In der Callback Funktion wird nun ein lokalerHWND hForeGroundWin = NULL; hForeGroundWin = GetForegroundWindow();angelegt und mit dem gemeinsamen WindowHandle verglichen
if (hForeGroundWin != hOldForeGroundWin) { hOldForeGroundWin = hForeGroundWin; //... }So möchte ich quasi eine Änderung des Fensters "mitbekommen".
Komischerweise funktioniert das nur einmal.
Ich verstehe das nich! Mir kommt das so vor, als legt jede DLL ihr
eigenes hOldForeGroundWin an und der Vergleich funktioniert beim ersten mal nur, weil hOldForeGroundWin da noch NULL ist.
Aber es ist doch als shared deklariert???
Mit dem Buffer funktioniert das ganze doch auch????wär cool wenn mal jemand helfen könnte
ciao rene
-
Hast du dir die Handles mal ausgeben lassen, damit du siehst, ob sie auch korrekte Werte beinhalten. Evtl. Handle mal überprüfen

-
davon geh ich mal aus. ich hole mir über
GetWindowText(hForeGroundWin,WinText,100);
dann ja die fensterbeschreibung, funzt. der Handle sollte also ok sein.
Also ich hab dafür irgendwie echt keine Erklärung.
rene
-
also es ist tatsächlich so, dass jede DLL ihren eigenen hOldForegroundWin speichert.
Habe mir mal mit
HWND hForeGroundWin = NULL; hForeGroundWin = GetForegroundWindow(); char WinTextR[100]; GetWindowText(hForeGroundWin,WinTextR,100); MessageBox(NULL,WinTextR,"",MB_OK); _strset(WinTextR,0); GetWindowText(hOldForeGroundWin,WinTextR,100); MessageBox(NULL,WinTextR,"",MB_OK);die Texte ausgeben lassen. Beim ersten mal, ist hOldForegroundWin NULL, beim zweiten mal ist es in jedem Fenster, das Fenster selbst.
Die Variable wird also nicht geshared.
Wieso?
-
geht nicht:
static HWND hOldForeGroundWin;geht:
static HWND hOldForeGroundWin=NULL;**
MAN MERKE:
**
Variablen in einem gemeinsam benutztem Bereich einer DLL IMMER korrekt initialisieren.Man! da muss man ma drauf kommen!
