Eksportowanie z biblioteki DLL przy użyciu atrybutu __declspec(dllexport)
Firma Microsoft wprowadziła __export w wersji 16-bitowego kompilatora Visual C++, aby umożliwić kompilatorowi automatyczne wygenerowanie nazw eksportu i umieszczenie ich w pliku .lib.Ten plik .lib może zostać użyty jako statyczny .lib, aby łączyć z DLL.
W nowszych wersjach kompilatora, można wyeksportować dane, funkcje, klasy lub funkcje elementów członkowskich klasy z biblioteki DLL korzystając ze słowa kluczowego __declspec(dllexport).__declspec(dllexport) dodaje dyrektywy Eksport do pliku obiektu, dzięki czemu nie trzeba użyć pliku .def.
To udogodnienie jest najbardziej widoczne przy próbie eksportu nazw funkcji C++ z atrybutami.Ponieważ nie ma żadnych standardowych specyfikacji dla dekoracji nazwy, nazwa eksportowanych funkcji może się zmieniać między wersjami kompilatora.Jeśli korzystasz z __declspec(dllexport), ponowna kompilacja biblioteki DLL i zależnych plików .exe jest konieczna tylko konta do dowolnych zmian konwencji nazewnictwa.
Wiele dyrektyw dotyczących eksportowania takich jak liczby porządkowe, BEZ NAZWY i PRYWATNA można wykonać wyłącznie w pliku .def i nie ma sposobu określania tych atrybutów bez pliku .def.Jednakże używanie __declspec(dllexport) z plikiem .def nie powoduje błędów kompilacji.
Aby eksportować funkcje słowo kluczowe __declspec(dllexport) musi wyświetlić się po lewej stronie słowa kluczowego konwencji wywołania, jeżeli słowo kluczowe jest określone.Na przykład:
__declspec(dllexport) void __cdecl Function1(void);
Aby eksportować wszystkie publiczne elementy członkowskie danych i elementy członkowskie funkcji w klasie, słowo kluczowe musi wyświetlić 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 __clrcall konwencji wywoływania.
Kompilując DLL, zwykle tworzysz plik nagłówka, który zawiera prototypu funkcji i/lub klasy, które eksportujesz lub dodajesz __declspec(dllexport) do deklaracji w pliku nagłówka.Aby ułatwić czytelność kodu, zdefiniuj makro dla __declspec(dllexport) i użyj makra z każdym symbolem, który eksportujesz.
#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 liczby porządkowej zamiast nazwy.
[!UWAGA]
Przy portowaniu kodu źródłowego DLL z Win16 do Win32, zastąp każde wystąpienie __export__declspec(dllexport).
Jako punkt odniesienia poszukaj w pliku nagłówkowym Win32 Winbase.h.Zawiera przykłady użycia __declspec(dllimport).
Co chcesz zrobić?
Eksportuj funkcje C++ do użycia w plikach wykonywalnych w języku C
Eksportuj funkcje C do użycia w plikach wykonywalnych w języku C++ lub C