muss man dll entladen ?



  • hallo,

    ich habe mir eine statische lib geschrieben,
    die meine andere dynamische dll lädt,
    damit ich nur das schreiben brauche

    #pragma comment(lib, "mydll.lib")
    void* p = LoadDLL();  // <-- LoadDLL ist funktion aus der lib
    

    LoadDLL lädt meine dynamische dll und gibt mir einen zeiger auf die dll funktion, damit ich dann mit der dll arbeiten kann,

    die frage ist, muss ich meine dynamische dll am ende im programm entladen mit FreeLibrary() ? oder geschiet das automatisch bei windows XP ?

    wenn ich das machen muss, wie könnte ich das am besten machen... ?
    mein ansatz:
    ich könnte in die statische lib noch eine funktion UnloadDLL() machen, die intern FreeLibrary() aufruft und andere sachen erledigt,
    aber die erfodert hinstance auf die geladene dll, die bei mir in der funktion LoadDLL privat drin ist, wie könnte ich das in der UnlaodDLL dann aufrufen ? über parameter will ich das nicht übergeben, da ich auf die hinstance von aussen nicht zugreifen kann,

    mfg

    EDIT: code umgeändert



  • #pragma comment(lib, "mydll.dll")
    

    Ist das nicht für statische Bibliotheken, also .lib-Files gedaht 😕



  • Hi !!

    Ich versteh nicht warum du über Paris von München nach Rom fährst ??

    #pragma comment (lib, "mydll.dll")
    

    Ist eigentlich nicht gültig, soviel ich weiss....

    Wenn du eine DLL schreibst, wird eine ExportBibliothek angelegt, wenn du deine
    Funktionen exportierst. (sonst sind sie ja nicht nutzbar).
    Wenn du also deine "Client-Andwendung" schreibst, werden die Symbole mit Hilfe dieser Lib befriedigt und die DLL beim start der Anwendung automatisch gesucht und geladen. Beim beenden (oder später) wird diese dann automatisch entladen.
    Falls du die Adressen der DLL mit GetProcAdress manuell lädst, dann solltest du
    Sie mit FreeLibary() tatsächlich wieder freigeben. Allerdings bevorzuge ich die erste Version, ausser es handelt sich um eine Plugin DLL oder sowas in die Richtung.
    rya.
    Scorcher24

    p.s.:

    Zum epxortieren von Funktionen kannst Du dieses nette Macro im Header anlegen. (Muss beim Client eingebunden werden:

    #if defined (DLL_EXPORTS)
    #define EXPORT __declspec dllexport
    #else
    #define EXPORT __declspec dllimport
    #endif
    

    Das stellt sicher, dass beim einbinden der Header die Funktion oder Klasse importiert, beim kompilieren exportiert wird.
    Natürlich musst du die Funktionen (Klassen) dementsprechen markieren (und DLLEXPORTS im DLL-Projekt definieren)

    EXPORT void Foo( int a, int b );
    class EXPORT bar
    {
    public:
      bar();
      ~bar();
    };
    

Anmelden zum Antworten