Udostępnij za pośrednictwem


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ć?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Eksportowanie z biblioteki DLL