dll (statisch) import mehrere projekte



  • Schönen Abend,

    hab mal wieder ein Problem, diesmal versuchte ich eine DLL zu "bauen".
    Ich will eine Variable des Datentyps int in der DLL deklarieren und sie soll in allen Projekten, die zu der Projektgruppe gehören verfügbar sein.
    In die Datei
    dll.cpp
    habe ich

    __declspec(dllexport)int f;
    

    geschrieben.

    begruessung.h (hier wird die variable gebraucht):

    __declspec(dllimport) int f;
    

    und in die
    main.h habe ich den gleichen Aufruf noch einmal gemacht.
    Mir ist klar, dass es falsch ist, aber mir ist nicht klar, wie ich es richtigstelle.

    Kurz zu dem "Projekt".
    In der begruessung.h wird eine Variable ausgewählt (aus einer ComboBox) und soll dann in der main.cpp verfügbar sein, weil sie dort wieder benötigt wird.
    Das Formular "Main" wird nach dem Formular "Begruessung" aufgerufen und "Begruessung" wird auch wieder geschlossen. Also die Variable muss eben auch verfügbar sein wenn das Formular "Begruessung" geschlossen ist und genau das ist das Problem.

    Bin für jegliche Hilfe dankbar.

    Grüße

    Matthi



  • Hi Matthi,

    über eine DLL sollte das funktionieren, wenn Du eine Funktion verwendest, mit der Du die Variable schreibst und liest.

    Aber Du brauchst diesen Umweg gar nicht zu machen. Includiere 'main' in 'begruessung' und definiere die Variable in 'main' als public. Dann kannst Du aus 'begruessung' die Variable direkt in 'main' setzen.



  • Ich habe den Verdacht, er möchte die DLL dazu benutzen, Daten zwischen separaten Anwendungen auszutauschen. D.h. mit Programm A einer Variable in der DLL einen Wert zuweisen und mit Programm B den Wert der Variablen aus der DLL auslesen.
    Ich habe nicht genug Ahnung von DLLs um das definitiv zu beantworten, denke aber, das das nicht möglich ist.



  • es ist genauso wie jansen es sagte ... welche möglichkeiten gibts denn sonst dafür?
    mir würde auf die schnelle nur einfallen, das ganze in eine datei zu schreiben.
    gibt es noch eine andere möglichkeit?

    vielen dank, und grüße

    matthi



  • Eine Möglichkeit die ich sehen würde ist eine DLL-Globale und exportierende Zugriffsfunktionen (getF, setF) wies Joe geschrieben hatte.

    -junix


  • Mod

    Hallo

    Datenaustausch zwischen seperaten Anwendungen auszutauschen
    sollte doch mittels API funktionieren (Atom)

    Bin mir nicht ganz sicher 😕

    MfG
    Klaus



  • Es gibt mehrere Wege Datenaustausch zu betreiben. das Atom ist eine, es gibt aber auch noch Pipes, Semaphoren, etc.

    -junix



  • Hi, das habe ich gestern schon versucht zu posten... Aber es war ja wieder mal kein Zugriff möglich....

    Ich hab' dazu folgendes gefunden (allerdings bin ich mir nicht sicher ober das nur mit MFC funktioniert):

    Du musst wie folgt vorgehen: 1. Definiere Dir einen eigenen Datentypen, welchen Du in den shared Memory halten willst, z.B.:

    typedef struct structSHM_ 
    { 
    	TCHAR			szMyString[256]; 
    } STRUCTSHM, *PSTRUCTSHM;
    

    2. Definiere folgende zwei globale Variablen in Deiner DLL:

    // globale Variablen 
    HANDLE			hMapping = NULL; 
    PSTRUCTSHM		pSHM;
    

    3. Nun erstellst Du ein FileMapping-Object in der DllMain-Methode im Bereich "case DLL_PROCESS_ATTACH:", wie folgt:

    // Create a file mapping object. 
    SECURITY_ATTRIBUTES secAttr; 
    SECURITY_DESCRIPTOR sid; InitializeSecurityDescriptor(&sid, SECURITY_DESCRIPTOR_REVISION); 
    SetSecurityDescriptorDacl(&sid, TRUE, NULL, FALSE); secAttr.nLength=sizeof(SECURITY_ATTRIBUTES); 
    secAttr.lpSecurityDescriptor=&sid; 
    secAttr.bInheritHandle=TRUE; hMapping = ::CreateFileMapping ((HANDLE) INVALID_HANDLE_VALUE, 
    				&secAttr,  
    				PAGE_READWRITE, 
    				0, 
    				sizeof(STRUCTSHM), 
    				SHMNAME); 
    if (hMapping == NULL || hMapping == INVALID_HANDLE_VALUE) 
    { 
    	// Fehlermeldung ausgeben				 
    	return FALSE; 
    } // Convert the handle into a pointer. 
    pSHM = (PSTRUCTSHM) ::MapViewOfFile (hMapping, FILE_MAP_ALL_ACCESS, 					0, 0, 0); if (pSHM == NULL) 
    { 
    	// Fehlermeldung ausgeben					::CloseHandle (hMapping); 
    	return FALSE; 
    }
    

    4. In der DLLMain-Methode im Abschnitt "case DLL_PROCESS_DETACH:" kann der SharedMemory wieder geschlossen werden (wird aufgerufen, wenn kein Prozess mehr einen verweis auf die DLL hat):

    if (pSHM) 
    { 
    	::UnmapViewOfFile (pSHM); 
    	pSHM = NULL; 
    } 
    if	(hMapping) 
    { 
    	::CloseHandle (hMapping); 
    	hMapping = NULL; 
    }
    

    5. In der .def-Datei Deines DLL-Projektes musst Du nun noch den folgenden Eintrag hinzufügen:

    SECTIONS
    .sdata READ WRITE SHARED

    Das wars. Nun kannst Du Daten aus verschiedenen Prozessen, welche Deine DLL laden über den definierten Shared-Memory-Bereich austauschen. Du solltest aber deine DLL Multithreading-fähig programmieren, so dass sich verschiedene Prozesse untereinander nicht ungewollt beeinflussen.


Anmelden zum Antworten