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ć?
Wyeksportuj z biblioteki DLL przy użyciu polecenia . Pliki DEF
Eksportowanie z biblioteki DLL przy użyciu biblioteki __declspec(dllexport)
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)