Export z knihovny DLL pomocí souborů .DEF

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í soubor .def 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í seznam názvů a volitelně pořadové hodnoty funkcí exportovaných 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 řádu, podívejte se na téma Export funkcí z DLL knihovny podle řádu namísto názvu a na toto téma.

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 názvy funkcí, které mají být exportovány do tohoto souboru.Pro non-MFC knihovny DLL musíte sami vytvořit soubor .def a přidat ho k projektu.

Pokud exportujete funkce v souboru jazyka C++, musíte umístit do souboru .def dekorované názvy nebo definovat 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 DLL knihovnou sestaveny stejnou verzí jazyka Visual C++, aby dekorované názvy ve volání aplikace odpovídaly exportovaným názvům v .def souboru knihovny DLL.

Pokud vytváříte rozšíření DLL knihovny a exportujete pomocí souboru .def, umístěte následující kód na začátek a na konec 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 makro rozbalí a přidá členskou proměnnou CRuntimeClass do 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?

O čem chcete vědět více?

Viz také

Koncepty

Export z knihovny DLL