Verändisproblem bei DLL-Dateien



  • Ich möchte eine einfache DLL-Datei programmieren, wo sich einige Funktionen befindetn sollen, die dann abschließend von anderen Anwendung aufrufen kann. Dazu habe ich ein Beispiel, wie man das umsetzen kann:

    // Die Header-Datei
    #ifndef __MAIN_H__
    #define __MAIN_H__
    
    #include <windows.h>
    
    /*  To use this exported function of dll, include this header
     *  in your project.
     */
    
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    void DLL_EXPORT SomeFunction(const LPCSTR sometext);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // __MAIN_H__
    

    Was bedeutet das nun genau? Irgendwie verstehe ich das nicht. Kann mir das jemand erklären? 🙂



  • Wenn DLL-Funktionen von außerhalb aufgerufen werden können sollen, dann musst du sie exportieren. Das macht man in der DLL mit __declspec(dllexport). Auf der anderen Seite (also in einer externen Anwendung) musst du stattdessen __declspec(dllimport) verwenden. Um dir das Denken abzunehmen ( 😉 ), wird hier DLL_EXPORT definiert. Abhängig davon, ob du dich in der DLL befindest oder nicht, wird eben dllimport oder dllexport vom Präprozessor in den Code eingefügt. So musst du immer nur DLL_EXPORT benutzen.

    Da wir im C++-Forum sind, schon mal der Tipp: Informier dich mal, was es mit 'extern "C"' auf sich hat.

    EDIT: Ach, extern "C" wurde ja schon berücksichtigt. Hatte ich übersehen...



  • Das gehört eigentlich ins Forum WinAPI, mit ANSI C++ hat das nichts zu tun.

    Mit

    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    

    sagst du deinem Compiler, dass er eine Funktion mit diesem Präfix in eine DLL schreiben soll. __declspec(dllexport) also, um die Deklaration der Funktionen/Klassen in eine DLL auszulagern. Hier legt der Autor ein paar kürzere Makros dafür fest.

    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    void DLL_EXPORT SomeFunction(const LPCSTR sometext);
    
    #ifdef __cplusplus
    }
    #endif
    

    Hier hat der Autor ab und zu ein paar Präprozessor-Anweisungen, z.B. wenn es ein C++-Compiler ist, der das übersetzt, dann soll das durch extern "C" { } als C-Code markiert sein, bei Klassen ist das natürlich nicht der Fall. Dann hat er da noch eine DLL-Funktion.
    Wenn du dann den Code compilierst hast du am Ende 2 Dateien, eine DLL mit den Deklarationen, einer Tabelle aller Export-Funktionen deines Programms uns eine LIB, die enthält die Implementierung der Funktionen.


Log in to reply