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.h

    static 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 Lib

    Ausgabe(void) <- Aus Dll laden
    AendereDaten(int,char*) <- Aus Dll laden
    Var1 <- Aus der Lib nehmen (durch static nur einmal)
    Var2 <- Aus der Lib nehmen

    Ich 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 herausgefunden

    AendereDaten(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 rein

    extern __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;
    

Anmelden zum Antworten