EKSPORTY

Wprowadza sekcję co najmniej jednej definicji eksportu, która określa wyeksportowane nazwy lub reguły funkcji lub danych. Każda definicja musi znajdować się w osobnym wierszu.

EXPORTS
   definition

Uwagi

Pierwsza definicja może znajdować się w tym samym wierszu co EXPORTS słowo kluczowe lub w kolejnym wierszu. Tthe. Plik DEF może zawierać co najmniej jedną EXPORTS instrukcję.

Składnia definicji eksportu to:

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

entryname to nazwa funkcji lub zmiennej, którą chcesz wyeksportować. Jest to wymagane. Jeśli eksportowana nazwa różni się od nazwy w dll, określ nazwę eksportu w dll przy użyciu internal_name. Jeśli na przykład biblioteka DLL eksportuje funkcję func1 i chcesz, aby wywołujące używały jej jako func2, należy określić:

EXPORTS
   func2=func1

Jeśli eksportowana nazwa pochodzi z innego modułu, określ nazwę eksportu w dll przy użyciu other_module.export _name. Jeśli na przykład biblioteka DLL eksportuje funkcję other_module.func1 i chcesz, aby wywołujące używały jej jako func2, należy określić:

EXPORTS
   func2=other_module.func1

Jeśli nazwa eksportowana pochodzi z innego modułu, który eksportuje według porządkowych, określ porządkowy eksport w dll przy użyciu other_module.#porządkowe. Jeśli na przykład biblioteka DLL eksportuje funkcję z innego modułu, w którym jest on porządkowy 42, i chcesz, aby osoby wywołujące używały jej jako func2, należy określić:

EXPORTS
   func2=other_module.#42

Ponieważ kompilator MSVC używa dekoracji nazw dla funkcji języka C++, należy użyć nazwy ozdobionej internal_name lub zdefiniować wyeksportowane funkcje przy użyciu extern "C" w kodzie źródłowym. Kompilator dekoruje również funkcje języka C, które używają __stdcall konwencji wywoływania z prefiksem podkreślenia (_) i sufiksem składającym się z znaku at (@), a następnie liczby bajtów (w przecinku) na liście argumentów.

Aby znaleźć nazwy ozdobione utworzone przez kompilator, użyj narzędzia DUMPBIN lub konsolidatora /MAP opcji. Nazwy ozdobione są specyficzne dla kompilatora. W przypadku wyeksportowania nazw ozdobionych w obiekcie . Plik DEF, pliki wykonywalne, które łączą się z biblioteką DLL, muszą być również skompilowane przy użyciu tej samej wersji kompilatora. Dzięki temu nazwy ozdobione w obiekcie wywołującym są zgodne z wyeksportowanymi nazwami w obiekcie . Plik DEF.

Można użyć @ordinal , aby określić, że liczba, a nie nazwa funkcji, przechodzi do tabeli eksportu bibliotek DLL. Wiele bibliotek DLL systemu Windows eksportuje reguły, aby obsługiwać starszy kod. Często używano zwykle kodu systemu Windows w 16-bitowym kodzie systemu Windows, ponieważ może pomóc zminimalizować rozmiar biblioteki DLL. Nie zalecamy eksportowania funkcji według porządkowych, chyba że klienci biblioteki DLL potrzebują jej do obsługi starszej wersji. Ponieważ element . Plik LIB będzie zawierać mapowanie między porządkowym i funkcją, można użyć nazwy funkcji, jak zwykle w projektach korzystających z biblioteki DLL.

Używając opcjonalnego słowa kluczowego NONAME , można wyeksportować tylko przez porządkowe i zmniejszyć rozmiar tabeli eksportu w wynikowej biblioteki DLL. Jeśli jednak chcesz użyć polecenia GetProcAddress w dll, musisz znać porządkowy, ponieważ nazwa nie będzie prawidłowa.

Opcjonalne słowo kluczowe PRIVATE uniemożliwia dołączanie nazwy entryname do biblioteki importu wygenerowanej przez link. Nie ma to wpływu na eksport na obrazie również wygenerowany przez link.

Opcjonalne słowo kluczowe DATA określa, że eksport to dane, a nie kod. W tym przykładzie pokazano, jak można wyeksportować zmienną danych o nazwie exported_global:

EXPORTS
   exported_global DATA

Istnieją cztery sposoby eksportowania definicji wymienionej w zalecanej kolejności:

  1. Słowo kluczowe __declspec(dllexport) w kodzie źródłowym

  2. Instrukcja EXPORTS w elemecie . Plik DEF

  3. / EXPORT specyfikacji w poleceniu LINK

  4. Dyrektywa komentarza w kodzie źródłowym formularza #pragma comment(linker, "/export: definition "). W poniższym przykładzie przedstawiono dyrektywę komentarza #pragma przed deklaracją funkcji, gdzie PlainFuncName jest nieukodowaną nazwą i _PlainFuncName@4 jest dekorowaną nazwą funkcji:

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

Dyrektywa #pragma jest przydatna, jeśli musisz wyeksportować nieukodowaną nazwę funkcji i mieć różne eksporty w zależności od konfiguracji kompilacji (na przykład w kompilacjach 32-bitowych lub 64-bitowych).

Wszystkie cztery metody mogą być używane w tym samym programie. Gdy link tworzy program zawierający eksporty, tworzy również bibliotekę importu, chyba że element . Plik EXP jest używany w kompilacji.

Oto przykład sekcji EKSPORTY:

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

Podczas eksportowania zmiennej z biblioteki DLL przy użyciu elementu . Plik DEF, nie trzeba określać __declspec(dllexport) zmiennej. Jednak w każdym pliku, który używa biblioteki DLL, należy nadal używać __declspec(dllimport) w deklaracji danych.

Zobacz też

Zasady dla instrukcji definicji modułu