CString global aus DLL laden ?



  • Hallo,

    ich möchte gerne aus einer DLL einen bestimmten
    CString an meine Anwendung übergeben.

    In der DLL gibt es den CString Ereignis,
    der den Wert = "Hallo" hat.

    Nun habe ich die DLL bei Programmstart so importiert:

    __declspec (dllimport) void EreignisFunk(void);
    

    In der MFC-Anwednung gibt es eine globale Variable vom
    Typ CString, die ebenfalls Ereignis heißt.
    Ich rufe die EreignisFunk() dann im Programm irgendwo auf,aber
    die globale Variable im Programm nimmt nicht den Wert von der
    DLL an ?

    Wird nicht alles aus der DLL praktisch so behandelt, als würde es
    im Quelltext der MFC-Anwednung stehen ?

    Oder is das totaler murks was ich mir da ausgedacht habe ?



  • weist du denn in der Ereignisfunktion den Inhalt von "DLL CString Ereignis" zu?



  • Hi PAD,

    also in der DLL weise ich Ereignis einen Wert zu, ja.
    Ich kann den z.B. in der gleichen EreignisFunk()
    so einbinden:

    MessageBox(NULL, Ereignis, "Testereignis", MB_OK);

    Und es wird dann die MessageBox auch richtig in der MFC-
    Anwendung mit dem Wert "Hallo" aus der DLL ausgegeben.

    Nur in der Anwendung die CStrings aus der DLL weiter zu verarbeiten
    geht nicht. Alsob diese nicht existieren bzw. nur in der aufgerufenen
    EreignisFunk() die ich exportierte, gültig sind ?!



  • Du nimmst da aber da lokale Ereigniss. Du musst der globalen Variablen aus dem Haupprogramm den wert zuweisen

    Hier ein Beispiel in C

    Hauptprogramm
    char GlobalEreignis[128+1];];// das +1 ist eine Marotte von mir um den üblichen Fehler zu 
                                 // vermeiden das für die schließende Null kein Platz mehr da ist.   
    
    int SetGlobalEreignis(char *data) // Accessfunktion 1 Setzen der globalen
     {
      strcpy(GlobalEreignis,data)
      return 0;
     }
    
    int GetGlobalEreignis(char *data) // Accessfunktion 2 Lesen der globalen
     {
      strcpy(data,GlobalEreignis)
      return 0;
     }
    
    int main( int argc, char *argv[ ]) 
     { 
      ........
     }
    
    DLL
    
    ...EreignisFunk() 
     {
      char Ereignis[]={"HALLO"}
      ...............
      MessageBox(NULL, Ereignis, "Testereignis", MB_OK); 
      SetGlobalEreignis(Ereignis);
      ...............
    }
    

    Ein deutlich sinnvolleres Design ist wenn du diese Globale in die DLL verlagerst und diese globale dann über die Accessfunktionen in allen Programmteilen benutzt.

    Wenn du die Accessfunktionen und die globale in das Main-Programm setzt kommt es zu einem Henne Ei Problem
    int der DLL da der linker die 3 extrenen Referenzen nicht ( Ereignis,SetGlobalEreignis,GetGlobalEreignis) nict auflösen kann



  • Hmm, also irgendwie versteh ich das noch nicht ganz 😕

    Ich setz in der DLL folgendes:

    __declspec (dllexport) void testdll(void)
    {
    
    CString hallo;
    hallo ="hallo dll";
    
    	  }
    

    Nun habe ich in der Hauptanwendung zum laden:

    __declspec (dllimport) void testdll(void);
    

    und ich dachte dann wird der CString hallo als global
    in meine Anwendung übernommen, so dass ich ihn überall
    während das Programm läuft verwenden kann.

    Wie geht das denn nun richtig ?
    Der Code von dir produziert bei mir leider Fehler 😞

    Ich mach irgendwas falsch ?!



  • Schu dir die Bemerkungen unter dem Code nochmal an Speziell das Henne Ei Problem.

    Du solltest folgendes in die DLL packen

    Die globale Variable
    int SetGlobalEreignis(char *data) // Accessfunktion 1 Setzen der globalen
    int GetGlobalEreignis(char *data) // Accessfunktion 2 Lesen der globalen

    Dann sollte es funktionieren

    Um etwas global zu definieren/deklarieren mußt du es außerhalb jeder Funktion definieren.
    Dein Code erzeugt eine lokale Variable hallo der du den Wert "hallo dll" zuweist.
    Sobald du diese funktion verlässt ist diese Variable zerstört.

    __declspec (dllexport) void testdll(void) 
    { 
    
    CString hallo; 
    hallo ="hallo dll"; 
    
    }
    

    Um hier eine globale Variable zu machen müßtest du folgendes Schreiben

    CString hallo;
    __declspec (dllexport) void testdll(void) 
      { 
       hallo ="hallo dll"; 
       }
    

    ein kleiner aber entscheidender Unterschied.
    Damit du im Hauptprogramm darauf zugreifen kannst, musst du in allen Files die
    auf diese Variable zugreifen folgendes einfügen

    extern CString hallo;
    

    Das ist aber schlechter Stil, deswegen der Vorschlag mit den Accessfunktionen.



  • Ich habe eine andere Lösung für dich:

    Mache keine globalen Variablen oder syncronisiere den Zugriff darauf.



  • Unix-Tom schrieb:

    Ich habe eine andere Lösung für dich:

    Mache keine globalen Variablen oder syncronisiere den Zugriff darauf.

    Was meinst du mit syncronisiere den Zugriff darauf?


Anmelden zum Antworten