Sdílet prostřednictvím


Export z knihovny DLL pomocí .DEF souborů

Definiční soubor modulu (.def), je textový soubor obsahující jeden nebo více příkazů modulu, které popisují různé atributy knihovny DLL. Pokud nepoužíváte pro export funkcí knihovny DLL klíčové slovo __declspec(dllexport), pak vyžaduje knihovna DLL soubor .def.

Minimální .def soubor musí obsahovat následující příkazy definice modulu:

  • První příkaz v souboru musí být příkaz LIBRARY. Tento příkaz určuje soubor .def jako soubor, který patří knihovně DLL. Příkaz LIBRARY je následován názvem knihovny DLL. Propojovací program umístí tento název v knihovně importu knihovny DLL.

  • Příkaz EXPORTS uvádí názvy a případně pořadové hodnoty funkcí, které jsou exportovány knihovnou DLL. Funkci přiřadíte pořadovou hodnotu tím, že za názvem funkce napíšete zavináč (@) a číslo. Zadané pořadové hodnoty, musí být v rozsahu 1 až N, kde N je počet funkcí, které jsou exportovány knihovnou DLL. Pokud chcete exportovat funkce podle řadu, podívejte se na téma Export funkcí z DLL knihovny podle řádu, než podle názvu stejně stejně jako v tomto tématu.

Například knihovna DLL, která obsahuje kód pro implementaci binárního vyhledávacího stromu, může vypadat následovně:

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

Používáte-li Průvodce knihovny MFC DLL k vytvoření knihovny MFC DLL, vytvoří pro Vás průvodce kostru souboru .def a ten automaticky přidá do Vašeho projektu. Přidejte do tohoto souboru názvy funkcí, které mají být exportovány. Pro non-MFC knihovny DLL musíte sami vytvořit .def soubor a přidat ho do projektu.

Pokud exportujete funkce v souboru jazyka C++, musíte umístit do .def souboru dekorované názvy nebo definujte Vámi exportované funkce standardním C propojením pomocí externího "C". Pokud potřebujete umístit do .def souboru dekorované názvy, můžete je získat pomocí nástroje DUMPBIN nebo pomocí volby propojovacího programu /MAP. Všimněte si, že dekorované názvy produkované kompilátorem, jsou specifické pro kompilátor. Pokud umístíte dekorované názvy produkované kompilátorem jazyka Visual C++ do .def souboru, pak musí být aplikace které jsou propojeny s Vaší DLL knihovnou sestaveny stejnou verzí jazyka Visual C++ tak, aby dekorované názvy ve volání aplikace odpovídaly exportovaným názvům v .def souboru knihovny DLL.

Pokud vytváříte rozšiřující DLL knihovny a exportujete pomocí .def souboru, umístěte následující kód na začátku a na konci Vašich souborů hlaviček, které obsahují exportované třídy:

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

Tyto řádky zajistí, že proměnné knihovny MFC, které jsou použity interně nebo jsou přidané do Vašich tříd, jsou exportovány (nebo importovány) z Vaší rozšiřující DLL knihovny. Například při odvození třídy pomocí DECLARE_DYNAMIC, se rozbalí makro pro přidání členské proměnné CRuntimeClass do Vaší třídy. Vynechání těchto čtyř řádků by mohlo způsobit, že Vaše DLL knihovna bude nesprávně zkompilována nebo propojena nebo může způsobit chybu, když se bude klientská aplikace odkazovat na knihovnu DLL.

Při vytváření DLL knihovny, používá propojovací program .def soubor pro vytvoření exportního souboru (.exp) a souboru importované knihovny (.lib). Propojovací program poté použije exportní soubor pro sestavení souboru DLL knihovny. Spustitelné soubory které jsou implicitně propojené s DLL knihovnou, se propojí s importovanou knihovnou při sestavení.

Všimněte si, že knihovna MFC sama používá .def soubory pro export funkcí a tříd z knihovny MFCx0.dll.

Co chcete udělat?

Co chcete vědět více?

Viz také

Koncepty

Export z knihovny DLL