Sdílet prostřednictvím


EXPORTY

Představuje oddíl jedné nebo více definic exportu, které určují exportované názvy nebo pořadové názvy funkcí nebo dat. Každá definice musí být na samostatném řádku.

EXPORTS
   definition

Poznámky

První definice může být na stejném řádku jako EXPORTS klíčové slovo nebo na následujícím řádku. Tá. Soubor DEF může obsahovat jeden nebo více EXPORTS příkazů.

Syntaxe definice exportu je:

entryname[=internal_name other_module.exported|_name] [@ordinal [NONAME] ] [ [PRIVATE] | [DATA] ]

entryname je název funkce nebo proměnné, kterou chcete exportovat. Toto je povinné. Pokud se název, který exportujete, liší od názvu v knihovně DLL, zadejte název exportu v knihovně DLL pomocí internal_name. Pokud například knihovna DLL exportuje funkci func1 a chcete, aby ji volající používali jako func2, zadali byste:

EXPORTS
   func2=func1

Pokud je název, který exportujete, z nějakého jiného modulu, zadejte název exportu v knihovně DLL pomocí other_module.exported_name. Pokud například knihovna DLL exportuje funkci other_module.func1 a chcete, aby ji volající používali jako func2, zadali byste:

EXPORTS
   func2=other_module.func1

Pokud je název, který exportujete, z jiného modulu, který exportuje pořadové číslo, zadejte pořadové číslo exportu v knihovně DLL pomocí other_module.#řadový. Pokud například knihovna DLL exportuje funkci z jiného modulu, kde je pořadová hodnota 42, a chcete, aby ji volající používali jako func2, zadali byste:

EXPORTS
   func2=other_module.#42

Vzhledem k tomu, že kompilátor MSVC používá dekoraci názvů pro funkce jazyka C++, je nutné použít zdobený název internal_name nebo definovat exportované funkce pomocí extern "C" ve zdrojovém kódu. Kompilátor také ozdobí funkce jazyka C, které používají konvenci volání __stdcall s předponou podtržítka (_) a příponou složenou ze znaku at (@) následovaného počtem bajtů (v desítkové soustavě) v seznamu argumentů.

Pokud chcete najít zdobené názvy vytvořené kompilátorem, použijte nástroj DUMPBIN nebo možnost linker /MAP . Zdobené názvy jsou specifické pro kompilátor. Pokud exportujete zdobené názvy v souboru . Def soubor, spustitelné soubory, které odkazují na knihovnu DLL, musí být také sestaveny pomocí stejné verze kompilátoru. Tím zajistíte, že zdobená jména v volajícím odpovídají exportovaným názvům v sadě . DEF soubor.

Pomocí @řadového čísla můžete určit, že číslo, nikoli název funkce, přejde do tabulky exportu knihovny DLL. Řada knihoven DLL systému Windows exportuje ordinaly pro podporu staršího kódu. V 16bitovém kódu Windows bylo běžné používat ordinaly, protože může pomoct minimalizovat velikost knihovny DLL. Nedoporučujeme exportovat funkce podle řad, pokud ji klienti knihovny DLL nepotřebují pro podporu starší verze. Protože . Soubor LIB bude obsahovat mapování mezi pořadovým a funkcí, můžete použít název funkce jako obvykle v projektech, které používají knihovnu DLL.

Pomocí volitelného klíčového slova NONAME můžete exportovat pouze řadové hodnoty a zmenšit velikost tabulky exportu ve výsledné knihovně DLL. Pokud však chcete použít GetProcAddress v knihovně DLL, musíte znát pořadové číslo, protože název nebude platný.

Volitelné klíčové slovo PRIVATE zabraňuje zahrnutí názvu položky do knihovny importu vygenerované linkem. Nemá vliv také na export v imagi vygenerovaný linkem.

Volitelné klíčové slovo DATA určuje, že export je data, nikoli kód. Tento příklad ukazuje, jak můžete exportovat datovou proměnnou s názvem exported_global:

EXPORTS
   exported_global DATA

Existují čtyři způsoby, jak exportovat definici uvedenou v doporučeném pořadí:

  1. Klíčové slovo __declspec(dllexport) ve zdrojovém kódu

  2. Příkaz EXPORTS v objektu . DEF soubor

  3. Specifikace /EXPORT v příkazu LINK

  4. Direktiva komentáře ve zdrojovém kódu formuláře #pragma comment(linker, "/export: definition "). Následující příklad ukazuje direktivu #pragma comment před deklarací funkce, kde PlainFuncName je nezakódovaný název a _PlainFuncName@4 je zdobený název funkce:

    #pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
    BOOL CALLBACK PlainFuncName( Things * lpParams)
    

Direktiva #pragma je užitečná, pokud potřebujete exportovat nezakódovaný název funkce a mít různé exporty v závislosti na konfiguraci sestavení (například v 32bitových nebo 64bitových buildech).

Všechny čtyři metody lze použít ve stejném programu. Když LINK vytvoří program, který obsahuje exporty, vytvoří také knihovnu importu, pokud není . Soubor EXP se používá v sestavení.

Tady je příklad oddílu EXPORT:

EXPORTS
   DllCanUnloadNow      @1          PRIVATE
   DllWindowName = WindowName       DATA
   DllGetClassObject    @4 NONAME   PRIVATE
   DllRegisterServer    @7
   DllUnregisterServer

Při exportu proměnné z knihovny DLL pomocí . Def soubor, nemusíte zadávat __declspec(dllexport) proměnnou. V jakémkoli souboru, který používá knihovnu DLL, však musíte stále použít __declspec(dllimport) pro deklaraci dat.

Viz také

Pravidla pro příkazy definice modulu