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.