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