Ustalanie, jakiej metody eksportu użyć
Można wyeksportować funkcji na dwa sposoby — plik o rozszerzeniu def lub __declspec(dllexport) słowa kluczowego.Aby pomóc zdecydować, w jaki sposób jest lepszy do biblioteki DLL, należy rozważyć następujące pytania:
Czy zamierzasz eksportować więcej funkcji później?
Jest biblioteki DLL używane tylko przez aplikacje, które można odbudować lub jest używany przez aplikacje, które nie można odbudować — na przykład aplikacje, które są tworzone przez osoby trzecie?
Plusy i minusy korzystanie z plików o rozszerzeniu def
Eksportowanie funkcje w daje plik o rozszerzeniu def, kontrolować liczebniki porządkowe eksportu.Po dodaniu wyeksportowanej funkcji do biblioteki DLL, można przypisać wartość porządkową większą niż wyeksportowanej funkcji.Po wykonaniu tej aplikacji, które używają niejawna łączenie nie trzeba ponownie połączyć z biblioteką importu, który zawiera nową funkcję.Jest to bardzo wygodne w przypadku projektowania DLL do użycia przez wiele aplikacji, ponieważ można dodawać nowe funkcje i również zapewnić, że nadal działa poprawnie z aplikacjami, które już polegać na nim.Na przykład biblioteki MFC DLL są zbudowane za pomocą plików o rozszerzeniu def.
Inną korzyścią wynikającą z używania pliku o rozszerzeniu def jest, że można użyć NONAME atrybutu, aby wyeksportować funkcję.Spowoduje to umieszczenie tylko liczba porządkowa w tabeli eksportu w bibliotece DLL.Dll, które mają dużą liczbę eksportowanych funkcji za pomocą NONAME atrybut można zmniejszyć rozmiar pliku DLL.Aby dowiedzieć się, jak napisać instrukcja definicji modułu, zobacz Zasady dla instrukcji definicji modułu.Informacje eksportu porządkowych, zobacz Eksportowanie funkcji z biblioteki DLL według numeru porządkowego a nie nazwy.
Wadą korzystania z pliku o rozszerzeniu def będzie Jeśli eksportujesz funkcji w pliku C++, albo trzeba umieścić nazwy dekoracyjne w DEF. plik lub zdefiniować eksportowanych funkcji przy użyciu extern "C", aby uniknąć dekorowania nazwy, jaka została wykonana przez kompilator języka Visual C++.
Jeśli nazwy dekoracyjne umieszczone w pliku o rozszerzeniu def, można je uzyskać za pomocą DUMPBIN narzędzia lub przy użyciu linker /map opcji.Są specjalnie oznaczonymi nazwami, które są produkowane przez kompilator specyficznych dla kompilatora; w związku z tym Jeśli umieścisz specjalnie oznaczonymi nazwami, które są produkowane przez kompilator do pliku o rozszerzeniu def, aplikacje, które łącza do biblioteki DLL muszą również zbudowana przy użyciu tej samej wersji kompilatora, tak aby nazwy urządzone w aplikacji wywołującej pasują nazwy eksportowanych w pliku o rozszerzeniu def biblioteki dll.
Plusy i minusy przy użyciu __declspec(dllexport)
Za pomocą __declspec(dllexport) jest wygodne, ponieważ nie trzeba martwić się o zachowaniu pliku o rozszerzeniu def i otrzymywania dekoracyjną nazwy eksportowanych funkcji.Jednakże przydatność tego sposobu eksportowania jest ograniczona przez liczbę połączonych aplikacji, które chcesz odbudować.Po odbudowaniu DLL z nowych wywozu masz odbudować aplikacje, ponieważ dekoracyjną nazwy eksportowanych funkcji języka C++ mogą ulec zmianie, jeśli używasz innej wersji kompilatora ją.
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