DLL und globale Variablen in der *.cpp-Datei



  • Hallo,
    bin mir unsicher bei den folgenden Fragen und hoffe auf Informationen von euch um das zu klären:

    Wenn eine globale Variable in der *.cpp Datei einer DLL implementiert ist, welchen Gültigkeitsbereich hat sie dann und wie/wieoft/wo wird sie beim Aufruf durch Programme im Speicher angelegt?
    Zur Implementierung ist noch zu sagen, dass sie in diesem Fall nicht mit HeapAlloc( ... ) im Adressbereich des aufrufenden Prozesses angelegt ist, sondern einfach zu Beginn in der cpp-Datei angelegt wurde :

    // TestDLL.cpp
    Socket  TestDLLsocket;
    

    Kann mir jemand was konkretes zum Verhalten einer solchen Variablen sagen?
    Welchen Unterschied macht es, wenn diese globale Variable in der entsprechenden Headerdatei implementiert würde?

    danke
    arni



  • Nochmal Hallo,

    keiner da, der sich mit DLL's auskennt ??
    [push] |-)

    arni



  • Eher keiner da der globale Variablen in DLL verwendet.

    Ich bevorzuge dort Klassen.



  • Leider kann ich von mir nicht sagen, dass ich bei DLL's etwas bevorzuge, weil ich mich gerade in diese Themen reinarbeite. 🙄
    Meine Frage bezüglich der globalen Variablen beruht auf einem Beispielprojekt, dessen Funktionalität ich nachzuvollziehen versuche. Es scheint aber nicht von einem C++-Programmierer entwickelt worden zu sein, Klassen hat er nicht verwendet.

    In den Tutorien die ua DLL's behandeln, wird darauf hingewiesen, dass ja immer nur eine Instanz einer DLL im Arbeitsspeicher existiert, egal wie oft sie von Applikationen eingebunden werden. In diesem Beispiel werden aber die gleichen Variablen, die wie gesagt in der *.cpp-Darei global deklariert werden, von der Einsprungsfunktion DLL-Main immer wieder bei Aufrufen initialisiert. Es wird sogar das Handle (auch global deklariert) für den Thread nachher wieder zum Beenden des Threads genutzt.

    Nach meinem bisherigen Verständnis ist das ein dicker Fehler, da zu diesem Zeitpunkt niemand wissen kann, ob nicht ganz andere Threads jetzt mit dieser Handle -Variablen erzeugt worden sind. Da ich am lernen bin, verunsichert mich das. Ist meine Ansicht richtig oder habe ich nur etwas nicht kapiert? 😕 😕

    Thanks
    arni



  • Eine Dll besteht aus zwei Bereichen. einem Datenbereich und einem Bereich mit dem Programmcode. Bei jedem ProcessAttach der Dll in einem Programm wird der Datenbereich im Memorybereich des Processes erzeugt. Der Programmcode wird nur einemal in den Speicher geladen, und dann in jeden Process eingeblendet.

    Somit sind alle Variabeln die in der DLL sind im Datenbereich des Programms. Somit sind deine globalen Variabelen nur global in dem jeweiligen Programm. Startest su zwei Programme mit derselben dll hat jedes Program die globalen Variabelen aber jedes Programm seine eigenen.

    Brauchst du globale Variablen die für mehrere Programme global sind, so kannst du so etwas über shared Memory erreichen.



  • PAD schrieb:

    Brauchst du globale Variablen die für mehrere Programme global sind, so kannst du so etwas über shared Memory erreichen.

    Und das aber auch nur wenn es sich um die gleiche physische Datei handelt.
    Dh. sie muss aus dem gleichen Verzeichnis geladen werden.

    Die gleiche DLL aus einem anderen Bereich hat dann auch eine anderen Sharedmemorybereich.



  • @Unix-Tom
    Das gilt frühestens ab Windows 2000, da dort der absolute Pfad die dll identifizieret unter NT4 und niedriger ist das nicht der Fall.

    Ich weis auch nicht ob wir dasselbe shared Memory meinen.

    -Ich meine ein explizit angelegtes shared Memory mit eigenen Namen, welches über Create File als memory mapped file angelegt wird.

    - Ich glaube zu wissen, das man innerhalb einer dll variablen processübergreifend global anlegen kann, könnte es sein das du das meinst.



  • War nicht gegen dich gerichtet sondern nur eine algemeine Erklärung.

    Ich meine

    #pragma data_seg ("shared")
    int		iTotal = 0;
    char globstring[256][64] = {'\0'};
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    


  • @Unix-Tom habe ich auch nicht so empfunden.

    Wichtiger ist das beide Verfahren beschrieben und der Unterschied klar ist. Den DLL internen globalen Berich habe ich bisher nicht gebraucht.



  • Hai Pad und Unix-Tom,
    dieser Beitrag kommt spät, aber er ist mir ein Bedürfnis.
    Will mich einfach noch für eure Hilfe bedanken, eure Tipps waren die Schlüsselinformationen für das Design meiner DLL. Habe mich dann endlich ins entwickeln stürzen können, auch Klassen verwendet, was gigantische Vorteile bringt und nix mehr einfach profane globale Variablen.

    sollte man dann noch anfügen, dass ich für die dyn. Speicherallokierung dann auch 'HeapAlloc' und 'HeapFree' verwendet habe, um dann auch hier wo nötig den Adressbereich der aufrufenden Applikation zu verwenden, sonst kann es zu Komplikationen kommen, wenn mehrere Prozesse oder Threads versuchen, gleichzeitig im gleichen Adressbereich Speicher zu allokieren oder freizugeben.

    jetzt funzt alles wies soll.
    Danke für eure Hilfen 🙂
    arni


Anmelden zum Antworten