Udostępnij za pośrednictwem


Wybieranie metody eksportowania do użycia

Funkcje można eksportować na jeden z dwóch sposobów — pliku .def lub słowa kluczowego __declspec(dllexport) . Aby ułatwić podjęcie decyzji, który sposób jest lepszy dla biblioteki DLL, należy wziąć pod uwagę następujące pytania:

  • Czy planujesz później wyeksportować więcej funkcji?

  • Czy biblioteka DLL jest używana tylko przez aplikacje, które można ponownie skompilować, czy jest używana przez aplikacje, których nie można skompilować — na przykład aplikacji tworzonych przez inne firmy?

Zalety i wady używania plików .def

Eksportowanie funkcji w pliku .def zapewnia kontrolę nad domyślnymi eksportami. Po dodaniu wyeksportowanej funkcji do biblioteki DLL można przypisać jej wyższą wartość porządkową niż jakakolwiek inna wyeksportowana funkcja. W takim przypadku aplikacje korzystające z linków niejawnych nie muszą ponownie łączyć się z biblioteką importu zawierającą nową funkcję. Jest to bardzo wygodne, jeśli projektujesz bibliotekę DLL do użytku przez wiele aplikacji, ponieważ można dodać nowe funkcje, a także upewnić się, że nadal działa prawidłowo z aplikacjami, które już na niej polegają. Na przykład biblioteki DLL MFC są kompilowane przy użyciu plików .def.

Kolejną zaletą korzystania z pliku def jest to, że można użyć atrybutu NONAME do wyeksportowania funkcji. Spowoduje to wprowadzenie tylko porządkowych w tabeli eksportów w dll. W przypadku bibliotek DLL, które mają dużą liczbę eksportowanych funkcji, użycie atrybutu NONAME może zmniejszyć rozmiar pliku DLL. Aby uzyskać informacje o sposobie pisania instrukcji definicji modułu, zobacz Reguły instrukcji definicji modułu. Aby uzyskać informacje na temat eksportu porządkowego, zobacz Eksportowanie funkcji z biblioteki DLL według porządkowych, a nie według nazwy.

Wadą używania pliku .def jest to, że w przypadku eksportowania funkcji w pliku C++ musisz umieścić nazwy ozdobione w pliku .def lub zdefiniować wyeksportowane funkcje przy użyciu extern "C", aby uniknąć dekoracji nazw wykonanych przez kompilator MSVC.

Jeśli nazwy ozdobione zostały umieszczone w pliku .def, można je uzyskać przy użyciu narzędzia DUMPBIN lub za pomocą konsolidatora /MAP opcji. Nazwy ozdobione tworzone przez kompilator są specyficzne dla kompilatora; W związku z tym, jeśli nazwy ozdobione są tworzone przez kompilator do pliku .def, aplikacje łączące się z biblioteką DLL muszą być również skompilowane przy użyciu tej samej wersji kompilatora, aby nazwy ozdobione w aplikacji wywołującej odpowiadały wyeksportowanym nazwom w pliku def biblioteki DLL.

Zalety i wady korzystania z __declspec(dllexport)

Użycie __declspec(dllexport) jest wygodne, ponieważ nie trzeba martwić się o utrzymanie pliku .def i uzyskanie dekorowanych nazw wyeksportowanych funkcji. Jednak użyteczność tego sposobu eksportowania jest ograniczona przez liczbę połączonych aplikacji, które chcesz ponownie skompilować. Jeśli ponownie skompilujesz bibliotekę DLL przy użyciu nowych eksportów, musisz również ponownie skompilować aplikacje, ponieważ nazwy ozdobione dla wyeksportowanych funkcji języka C++ mogą ulec zmianie, jeśli użyjesz innej wersji kompilatora, aby go skompilować.

Co chcesz zrobić?

Co chcesz dowiedzieć się więcej?

Zobacz też

Eksportowanie z biblioteki DLL