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 globalenDann 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ügenextern 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?