Variablen und DLL
-
Hallöchen!!!
Ich hab da ein Problem mit DLLs
Und zwar brauch ich globale Variablen die mit Funktionen in der Dll verändert werden sollen.Ich hab folgenden Code
Globals.h
static int Var1=123; static char Var2[128]="Hallo Otto!"; __declspec(dllexport) void AendereDaten(int i,char *t); __declspec(dllexport) void Ausgabe(void);
Globals.cpp
#include<iostream> #include<cstring> using namespace std; #include"Globals.h" __declspec(dllexport) void AendereDaten(int i,char *t) { Var1=i; strncpy(Var2,t,127); } __declspec(dllexport) void Ausgabe(void) { cout<<"Var1="<<Var1<<endl <<"Var2=\""<<Var2<<"\""<<endl; }
Das ganze in eine Dll exportiert
Jetzt soll das mit dem folgenden Programm getestet werden
Globals.hstatic int Var1; static char Var2[128]; __declspec(dllimport) void AendereDaten(int i,char *t); __declspec(dllimport) void Ausgabe(void);
TestGlobals.cpp
#include<iostream> using namespace std; #include"Globals.h" int main() { Ausgabe(); Var1=321; Ausgabe(); Var1-=111; strncpy(Var2,"Himbeerbusch-Salat schmeckt gut! Jippi!",127); Ausgabe(); AendereDaten(456,"Hundehaufen, iiiiih!"); Ausgabe(); cin.ignore(); return(0); }
Ich erhalte aber nur folgende Ausgabe
[code]
Var1=123
Var2="Hallo Otto!"
Var1=123
Var2="Hallo Otto!"
Var1=123
Var2="Hallo Otto!"
Var1=123
Var2="Hallo Otto!"[cpp]Meine Vorstellung von dem ganzen ist folgende
Ausgabe(void) -> In die Dll exportieren
AendereDaten(int,char*) -> In die Dll exportieren
Var1 -> Ab in die Lib (durch static nur einmal)
Var2 -> Ab in die LibAusgabe(void) <- Aus Dll laden
AendereDaten(int,char*) <- Aus Dll laden
Var1 <- Aus der Lib nehmen (durch static nur einmal)
Var2 <- Aus der Lib nehmenIch dachte schon an eine Init Funktion, weiß aber nicht was die dann machen sollte
Kann mir jemand helfen?
Danke schonmal für jede Hilfe!
-
Deine Sources sind OK (habe mal eine VS-Solution erstellt, reinkopiert, und sie haben bei der letzten Ausgabe "456" ausgegeben), du machst irgendwas anderes falsch.
-
Die letzte Ausgabe ist 456, da habe ich mich bloß verschrieben (war das einzige mal -> Keine weiteren Verschreiber).
Mein Problem ist, dass die Var1, vom Testprogramm, nicht die selben ist wie die von der Dll, wobei Var1 aber eigentlich in die Lib gesteckt werden müsste.
Gleiches gilt für Var2.
Das habe ich so herausgefundenAendereDaten(111,""); Var1=222; strncpy(Var2,"222",127); cout<<Var1<<'\n'<<Var2<<endl;
Wenn es tatsächlich an mir liegen würde, dann schreib doch mal was dein Programm bei der 3. "Ausgabe()" ausgibt, wenn Var1 bei dir dann 210 ist werd ich zum Elch
Wäre schön wenns wirklich 210 ausgibt...
-
achso, war mir nicht klar, was dir an der Ausgabe nicht gefiel. Dann brauchst du so was hier:
extern __declspec(dllexport) int Var1; extern __declspec(dllexport) char Var2[128];
, also nicht static, sondern extern.
-
Ist nen bisschen problematisch mit globalen Variablen, die man in Exe und Dll ansprechen kann - hab ich jedenfalls so in Erinnerung.
Wenn du die Variablen mit "extern" spezifizierst, musst du sie auch irgendwo (in einer cpp-Datei) ohne extern einbinden; und zwar nur in eines der Module, sonst hat ja jedes seine eigenen globalen Variablen. Wenn ich mich grad nicht täusche, musst du sie in der Dll implementieren, da deine Exe über die Lib-Einbindung ja dann Kenntnis über die Variablen haben sollte.
Wenn das alles nicht klappt, solltest du globale Variablen über solche Grenzen hinweg halt vermeiden.
-
Ich hab ein bisschen probiert, und mit dem extern hab ich es hinbekommen!!!
So geht's:
In einer cpp für die Dll (am besten die mit DllMain) kommt das reinextern __declspec(dllexport) int Variable=123;
In alle weiteren cpps der Dll (oder über einen Header) das
extern __declspec(dllexport) int Variable;
Und in die cpps der Exe kommt immer das rein
extern __declspec(dllimport) int Variable;
Jetzt klappts!
Danke an alle, die mir geholfen haben!
-
Bei mir ging es nur wenn ich das Extern hier weglasse:
[s]extern [/s]__declspec(dllexport) int Variable=123;