DLL <-> Loader Shared Memory funktioniert nicht.
-
Hallo, ich bin zwar neu hier aber ich muss trotzdem mal was fragen.
Ich hab mir eine dll geschrieben und möchte Werte aus der Werte in mein Hauptprogramm übergeben (loader)
leider funktioniert das mit dem "sharedmemory" und den #pragmas nicht so ganz
- Anmerkung ich nutze MSVC++ 6.0hier ist ein Sourceschnipsel der dll:
// Variablen der dll.cpp #pragma data_seg(".SegmentXyZ") bool HookStatus=0; // Hook gesetzt ? HHOOK hhHook; // speicher für den Hook static HWND hButton=NULL; // Handle vom Button #pragma data_seg() ...so und hier will ich davon eine Variable in der loader.exe verwenden:
threadID=GetWindowThreadProcessId(hButton,&processID);und dann kommt der Compiler ins Spiel

'hButton' : nichtdeklarierter Bezeichner
so schön... wie stell ich es an das ich eine Variable hab die sowohl der dll.cpp als auch der loader.cpp bekannt ist und die sich, als Beispiel, im Wert in beiden Datein ändert wenn ich es in nur einer ändere... - versteht ihr was ich meine ?

Danke für eure Hilfe. Bin schon ganz verzweifelt

-
Versuch es mal so:
pragma data_seg ("shared") bool HookStatus = 0; // Hook gesetzt ? HHOOK hhHook = NULL; // speicher für den Hook static HWND hButton = NULL; // Handle vom Button #pragma data_seg() #pragma comment(linker,"/SECTION:shared,RWS")
-
Die Variable in dll.cpp exportieren und in loader.dll importtieren. Oder besser gleich eine Funktion exportieren/importieren, die die Variable zurückgibt, wie bei Klassen :).
BTW: Wie es flenders schon richtig gemacht hat, MUSS shared-Data initialisiert werden.
-
Puh, das hab ich noch nie gesehen.
Es ist ja schön, wenn man mit dem Linker böse Dinge machen kann, aber bringt das denn auch irgendwas?
-
Ringding schrieb:
Es ist ja schön, wenn man mit dem Linker böse Dinge machen kann, aber bringt das denn auch irgendwas?
Damit solltest du dann sowohl im Hauptprogramm als auch in der DLL auf die entsprechenden Variablen zugreifen können

-
Naja, da könnte man ja genausogut eine struct anlegen und eine Funktion machen, die einen Pointer darauf liefert. Da können dann auch beide drauf zugreifen.
-
Könnte man natürlich auch, ist aber eben nicht so komfortabel (und evtl. nicht so effizient?!)

-
flenders schrieb:
Ringding schrieb:
Es ist ja schön, wenn man mit dem Linker böse Dinge machen kann, aber bringt das denn auch irgendwas?
Damit solltest du dann sowohl im Hauptprogramm als auch in der DLL auf die entsprechenden Variablen zugreifen können

Nö, es macht was anderes.
Es setzt die Datensegment/section Eigenschaften auf Read|Write|Shared.
Auf die Daten einer DLL kannst du immer aus deinem "Hauptprogramm" zugreifen, sofern du die Adressen kennst und durch dieses Linker-Konstrukt kennst du die auch nicht.
Entscheident ist hier das Shared-Flag, mit dem dieses Datensegment unter allen Instanzen der DLL geteilt wird. Somit greifen die DLLs auf die gleichen Variablen zu. Wenn also DLLInstanz0 hButton ändert, so ändert sich auch hButton in der DLLInstanz1, usw...
-
Sorry, dann hatte ich da wohl was durcheinander gebracht
- Aber zum Glück gibt es hier ja einige User die wirklich Ahnung haben, so dass man nicht ganz so sehr aufpassen muss, was man schreibt (weil ja meistens noch irgendjemand Korrektur liest) 
-
Ich glaube dazu sollte man aber besser File Mapping benutzen