DLL Fragen
-
Hi
Ich versuche mich gerade an DLLs und habe da ein paar Fragen, zur exakten Funktionsweise. Grundsätzlich kann ich DLLs kompilieren und dynamisch laden (statisch sowieso).
Die Frage ist nun folgende: Ich will eine DLL dynamisch zur Laufzeit laden (wie nen Plugin). Allerdings habe ich ein paar Klassen, die nun sowohl vom Hauptprogramm, als auch von der DLL aus verwendet werden sollen, die über statische Variablen und Funktionen verfügen. Nach meinem ersten Test erscheint es so, als würde für die DLL und die EXE der statische Speicher der Klasse dupliziert, wodurch keine "Kommunikation" darüber zwischen DLL und EXE möglich ist.
Ehrlich gesagt wundert mich das nicht, aber ich suche halt doch nach einem Weg, dass statische Klassenvariablen tatsächlich nur einmal vorhanden sind und somit DLL und EXE exakt dieselben Daten manipulieren.
Da meine Klasse nun selbst in einer statischen Bibliothek untergebracht ist, hab ich mal ausprobiert diese Bibliothek als "Multithreaded-DLL" zu kompilieren (was bei VS 2005 sowieso als Standard für statische Bibliotheken eingestellt ist).
Ich hatte nun gehofft, dass wenn ich alle Bibliotheken als "Multithreaded-DLL" kompiliere, es vielleicht funktioniert wie erhofft. Allerdings kann ich die tatsächliche DLL nur "Multithreaded" kompilieren. Wenn ich es mit "-DLL" Anhängsel versuche, bekomme ich gut 20 Fehler a la
libcmt.lib(printf.obj) : error LNK2005: _printf ist bereits in MSVCRT.lib(MSVCR80.dll) definiert.
Erstens frage ich mich jetzt, was ich falsch mache, zweitens, ob mein Vorhaben so überhaupt umsetzbar ist. Kann mir also jemand sagen, ob es überhaupt möglich ist, dass die dynamisch geladene DLL auf die gleichen statische Daten einer Klasse zugreift, auf die auch die EXE zugreift? Wenn ja, wie?
Vielen Danke,
Jan.
-
Manipuliere einfach den Konstruktion "x69\x7a\xa8\xa1" der DLL
in Grobfunktion daher wird kein konsequentes Zusammenspiel mehr
ausgedrückt!*Ranner*
-
1. Klassen lassen sich nicht dynamisch aus einer DLL laden
2. Du linkst Deine DLL vermutlich noch mit einer anderen LIB und diese verwendet ein anderes CRT-Model (also statisch anstelle von DLL); alle LIBs/Projekte, die in einer DLL (oder auch EXE) landen *müssen* mit *der selber* Version und Einstellung der CRT erstellt werden
3. Wenn Du CRT/MFC/ATL Dinge zwischen der DLL und der EXE austauscht, so *muss* auch die EXE und DLL mit den gleichen CRT-Einstellungen erstellt werden
4. Statische Variablen in einer DLL gibt es logischerweise nur einmal in dem Prozess