Eksportowanie z biblioteki DLL przy użyciu plików DEF

Plik definicji modułów (o rozszerzeniu def) jest plikiem tekstowym zawierającym jedną lub więcej instrukcji modułu, które opisują różne atrybuty pliku dll.Jeśli nie używasz słowa kluczowego __declspec(dllexport) do eksportowania funkcji DLL, biblioteka DLL wymaga pliku .def.

Minimalny pliku .def musi zawierać następujące instrukcje definicji modułów:

  • Pierwsza instrukcja w pliku musi być instrukcją LIBRARY.Ta instrukcja identyfikuje plik .def jako należący do DLL.Po instrukcji LIBRARY następuje nazwa biblioteki DLL.Program łączący umieszcza tę nazwę w bibliotece importu biblioteki DLL.

  • Instrukcja EXPORTS wyświetla listę nazw oraz, opcjonalnie, wartości porządkowe funkcji eksportowanych przez DLL.Przypisujesz funkcji wartość porządkową przez dodane na końcu nazwy funkcji znaku (@) i numeru.Kiedy określasz wartości porządkowe, muszą znajdować się w zakresie od 1 do N, gdzie N to liczba funkcji eksportowanych przez DLL.Jeśli chcesz wyeksportować funkcje według liczby porządkowej, zobacz Eksportowanie funkcji z biblioteki DLL według liczby porządkowej zamiast nazwy, a także ten temat.

Na przykład biblioteka DLL, która zawiera kod implementujący drzewo binarnego wyszukiwania, może wyglądać następująco:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Jeśli korzystasz z Kreatora MFC DLL do utworzenia biblioteki MFC DLL, kreator tworzy plik .def szkieletu i automatycznie dodaje go do projektu.Dodaj nazwy funkcji, które mają zostać wyeksportowane do tego pliku.W przypadku bibliotek DLL nienależących do typu MFC, należy samodzielnie utworzyć plik .def i dodać go do projektu.

Jeśli eksportujesz funkcje w pliku C++, musisz umieścić nazwę uzupełnioną w pliku .def lub zdefiniować funkcje eksportowania ze standardowym sprzężeniem C za pomocą funkcji extern „C”.Jeśli musisz umieścić nazwy dekorowane w pliku .def, możesz je uzyskać, korzystając z narzędzia DUMPBIN lub przy użyciu opcji konsolidatora /MAP.Należy zauważyć, że nazwy dekoracyjne wytworzone przez kompilator są specyficzne dla kompilatora.Jeśli umieszczono nazwę dekorowaną wygenerowaną przez kompilator Visual C++ w pliku .def, aplikacje łączące do biblioteki DLL muszą być także kompilowane przy użyciu tej samej wersji programu Visual C++, aby nazwy dekorowane w aplikacji wywołującej odpowiadały nazwom eksportowanym w pliku .def biblioteki DLL.

Jeśli tworzysz rozszerzenie biblioteki DLL i eksportujesz używając pliku .def, umieść następujący kod na początku i na końcu plików nagłówka zawierających eksportowane klasy:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Linie te zapewniają, że zmienne MFC używane wewnętrznie lub dodawane do Twoich klas są eksportowane (lub importowane) z Twojego DLL rozszerzenia.Na przykład kiedy uzyskujesz klasę za pomocą DECLARE_DYNAMIC, makro rozszerza się, aby dodać zmienną członkowską CRuntimeClass do tej klasy.Pominięcie tych czterech linii może spowodować niepoprawną kompilację biblioteki DLL lub niepoprawne łączenie, lub spowodować wystąpienie błędu, gdy aplikacja kliencka łączy się z biblioteką DLL.

Kompilując DLL, konsolidator używa fliku.def, aby utworzyć plik eksportowy (.exp) i plik biblioteki importowej (.lib).Program łączący następnie używa pliku eksportu do tworzenia pliku DLL.Pliki wykonywalne, zawierające niejawne łącze do łącza biblioteki DLL do biblioteki importu podczas tworzenia.

Należy zauważyć, że MFC sam używa plików .def, aby wyeksportować funkcje i klasy z MFCx0.dll.

Co chcesz zrobić?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Eksportowanie z biblioteki DLL