Frage zu DLL



  • Hallo zusammen
    Ich dachte eine DLL wird nur einmal in den Arbeitsspeicher geladen. Wenn ich aber nun eine globale Variable in der DLL habe, die ich dann in Applikation1 ändere, dann ist diese Änderung in der Applikation2 nicht sichtbar ?? 😕

    // DLL - code
    #include <windows.h>
    
    int __declspec(dllexport) g_test = 0;
    
    bool DllMain(HINSTANCE hInst,DWORD dwReason,void* pResearved){
     return true;
    }
    
    // Applikation1 - code
    #include <stdio.h>
    
    int __declspec(dllimport) g_test;
    
    int main(void){
     g_test = 8;
     system("PAUSE");
     return 0;
    }
    
    // Applikation2 - code
    #include <iostream>
    
    int __declspec(dllimport) g_test;
    
    int main(void){
     std::cout g_test;
     return 0;
    }
    

    Output Applikation2: 0 😕

    Kann es sein, dass nur Funktionscode in den Adressraum einer von der entsprechenden DLL Gebrauch machenden Applikation eingeblendet wird, und Variablen nicht ??

    Gruss Ishildur

    P.S.
    Ach ja ich lasse Applikation1 zuerst laufen und starte dann Applikation2, während Applikation1 noch am laufen ist.



  • ➡ http://www.c-plusplus.net/forum/viewtopic.php?t=17458

    du brauchst das von flenders. funzt aber glaub ich nur mit visual c++



  • Der Begriff global wird von dir falsch interpretiert.
    Die globalen Variabeln sind nur global in dem Programm nicht auf dem Rechner.

    Eine Dll wir nur einmal geladen heißt der ausführbare Code ist genau einmal im Speicher des Rechners.
    Eine Dll besteht aber aus zwei Hauptsektionen dem Codebereich und dem Datenbereich.
    Der Codebereich wird genau einmal geladen. Der Datenbereich wird für jede Applikation neu erzeugt (GOTT SEI DANK).

    Um das zu tun was du möchtest gibt es zwei Möglichkeiten.
    ➡ Es gibt eine Möglichkeit in einer DLL einen benannten Memory Bereich
    zu erzeugen zur Rechner global ist. Das heißt alle Applikationen können,
    wenn sie diesen Bereich kennen darauf lesend und schreibend zugreifen. (Damit habe ich keinerlei Erfahrung)

    ➡ Man kann explizit shared Memory anlegen, und dieses dann von den n-Applikationen aus nutzen.

    Hier unten ein Bruch stück von Code den ich vor längerem benutzt habe, ers soll dir Hinweise geben wonach du in den Hilfen suchen sollst

    SHARED_MEM_DATA *A;
      HANDLE hFile = (HANDLE)0xffffffff;      // Datei ist nur im Speicher vorhanden, daher handle == 0xffffffff
      LPVOID lpMapAddress;                            // Zeiger auf den geteilten Speicher
    
      hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,"SHAREDMEM");
    
      if(hMapFile == NULL) 
      {
        hMapFile = CreateFileMapping(hFile,    // Current file handle.
        NULL,                              // Default security.
        PAGE_READWRITE,                    // Read/write permission.
        0,                                                // Max. object size.
        (sizeof(SHARED_MEM_DATA)),    // Size of hFile.
        "SHAREDMEM");           // Name of mapping object.
        if (hMapFile == NULL) 
         {
          printf("Could not create file-mapping object.");
         }
      }
    
      lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object.
      FILE_MAP_ALL_ACCESS,               // Read/write permission
      0,                                 // Max. object size.
      0,                                 // Size of hFile.
      0);                                // Map entire file.
    
      if (lpMapAddress == NULL) 
      {
        printf("Could not map view of file.");
      }
    
      A = (SHARED_MEM_DATA *)lpMapAddress;
      }
    

Anmelden zum Antworten