Eksportowanie z biblioteki DLL przy użyciu atrybutu __declspec(dllexport)
Za pomocą słowa kluczowego __declspec(dllexport)
można eksportować dane, funkcje, klasy lub funkcje składowe klasy z biblioteki DLL. __declspec(dllexport)
Dodaje dyrektywę eksportu do pliku obiektu, aby nie trzeba było używać pliku def.
Ta wygoda jest najbardziej widoczna podczas próby wyeksportowania ozdobionych nazw funkcji języka C++. Ponieważ nie ma standardowej specyfikacji dekoracji nazw, nazwa wyeksportowanej funkcji może ulec zmianie między wersjami kompilatora. Jeśli używasz metody __declspec(dllexport)
, ponowne kompilowanie bibliotek DLL i plików zależnych .exe jest konieczne tylko do uwzględnienia wszelkich zmian konwencji nazewnictwa.
Wiele dyrektyw eksportu, takich jak ordinals, NONAME i PRIVATE, można wykonać tylko w pliku def i nie ma możliwości określenia tych atrybutów bez pliku def. Jednak użycie __declspec(dllexport)
oprócz używania pliku .def nie powoduje błędów kompilacji.
Aby wyeksportować funkcje, __declspec(dllexport)
słowo kluczowe musi pojawić się po lewej stronie słowa kluczowego konwencji wywołującej, jeśli zostanie określone słowo kluczowe. Na przykład:
__declspec(dllexport) void __cdecl Function1(void);
Aby wyeksportować wszystkie publiczne składowe danych i funkcje składowe w klasie, słowo kluczowe musi pojawić się po lewej stronie nazwy klasy w następujący sposób:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Uwaga
__declspec(dllexport)
nie można zastosować do funkcji z konwencją __clrcall
wywoływania.
Podczas tworzenia biblioteki DLL zazwyczaj tworzy się plik nagłówkowy zawierający prototypy funkcji i/lub klasy eksportowane i dodawane __declspec(dllexport)
do deklaracji w pliku nagłówkowym. Aby kod był bardziej czytelny, zdefiniuj makro i __declspec(dllexport)
użyj makra z każdym eksportowanym symbolem:
#define DllExport __declspec( dllexport )
__declspec(dllexport)
przechowuje nazwy funkcji w tabeli eksportu biblioteki DLL. Jeśli chcesz zoptymalizować rozmiar tabeli, zobacz Eksportowanie funkcji z biblioteki DLL według porządkowych, a nie według nazwy.
Co chcesz zrobić?
Eksportowanie funkcji języka C++ do użycia w plikach wykonywalnych języka C
Eksportowanie funkcji języka C do użycia w plikach wykonywalnych języka C lub C++
Importowanie do aplikacji przy użyciu atrybutu __declspec(dllimport)