Bagikan melalui


EXPORTS

Memperkenalkan bagian dari satu atau beberapa definisi ekspor yang menentukan nama atau ordinal fungsi atau data yang diekspor. Setiap definisi harus berada di baris terpisah.

EXPORTS
   definition

Keterangan

Definisi pertama dapat berada di baris yang sama dengan EXPORTS kata kunci atau pada baris berikutnya. Tje. File DEF dapat berisi satu atau beberapa EXPORTS pernyataan.

Sintaks untuk definisi ekspor adalah:

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

entryname adalah nama fungsi atau variabel yang ingin Anda ekspor. Ini diperlukan. Jika nama yang Anda ekspor berbeda dari nama di DLL, tentukan nama ekspor di DLL dengan menggunakan internal_name. Misalnya, jika DLL Anda mengekspor fungsi func1 dan Anda ingin penelepon menggunakannya sebagai func2, Anda akan menentukan:

EXPORTS
   func2=func1

Jika nama yang Anda ekspor berasal dari beberapa modul lain, tentukan nama ekspor di DLL dengan menggunakan other_module.exported_name. Misalnya, jika DLL Anda mengekspor fungsi other_module.func1 dan Anda ingin penelepon menggunakannya sebagai func2, Anda akan menentukan:

EXPORTS
   func2=other_module.func1

Jika nama yang Anda ekspor berasal dari modul lain yang diekspor berdasarkan ordinal, tentukan ordinal ekspor di DLL dengan menggunakan other_module.#ordinal. Misalnya, jika DLL Anda mengekspor fungsi dari modul lain di mana itu adalah ordinal 42, dan Anda ingin penelepon menggunakannya sebagai func2, Anda akan menentukan:

EXPORTS
   func2=other_module.#42

Karena pengkompilasi MSVC menggunakan dekorasi nama untuk fungsi C++, Anda harus menggunakan nama yang didekorasi internal_name atau menentukan fungsi yang diekspor dengan menggunakan extern "C" dalam kode sumber. Pengkompilasi juga menghiasi fungsi C yang menggunakan konvensi panggilan __stdcall dengan awalan garis bawah (_) dan akhiran yang terdiri dari tanda at (@) diikuti dengan jumlah byte (dalam desimal) dalam daftar argumen.

Untuk menemukan nama yang didekorasi yang dihasilkan oleh pengkompilasi, gunakan alat DUMPBIN atau opsi linker /MAP . Nama yang didekorasi khusus untuk pengkompilasi. Jika Anda mengekspor nama yang didekorasi di . File DEF, executable yang ditautkan ke DLL juga harus dibuat dengan menggunakan versi pengkompilasi yang sama. Ini memastikan bahwa nama yang didekorasi dalam pemanggil cocok dengan nama yang diekspor di . File DEF.

Anda dapat menggunakan @ordinal untuk menentukan bahwa angka, dan bukan nama fungsi, masuk ke tabel ekspor DLL. Banyak DLL Windows mengekspor ordinal untuk mendukung kode warisan. Adalah umum untuk menggunakan ordinal dalam kode Windows 16-bit, karena dapat membantu meminimalkan ukuran DLL. Kami tidak menyarankan untuk mengekspor fungsi secara ordinal kecuali klien DLL Anda membutuhkannya untuk dukungan warisan. Karena . File LIB akan berisi pemetaan antara ordinal dan fungsi, Anda dapat menggunakan nama fungsi seperti biasa dalam proyek yang menggunakan DLL.

Dengan menggunakan kata kunci NONAME opsional, Anda dapat mengekspor berdasarkan ordinal saja dan mengurangi ukuran tabel ekspor dalam DLL yang dihasilkan. Namun, jika Anda ingin menggunakan GetProcAddress pada DLL, Anda harus mengetahui ordinal karena nama tidak akan valid.

Kata kunci opsional PRIVATE mencegah nama entri disertakan dalam pustaka impor yang dihasilkan oleh LINK. Ini tidak memengaruhi ekspor dalam gambar yang juga dihasilkan oleh LINK.

DATA kata kunci opsional menentukan bahwa ekspor adalah data, bukan kode. Contoh ini menunjukkan bagaimana Anda dapat mengekspor variabel data bernama exported_global:

EXPORTS
   exported_global DATA

Ada empat cara untuk mengekspor definisi, tercantum dalam urutan yang direkomendasikan:

  1. Kata kunci __declspec(dllexport) dalam kode sumber

  2. Pernyataan EXPORTS dalam . File DEF

  3. Spesifikasi /EXPORT dalam perintah LINK

  4. Direktif komentar dalam kode sumber, dari formulir #pragma comment(linker, "/export: definition "). Contoh berikut menunjukkan direktif komentar #pragma sebelum deklarasi fungsi, di mana PlainFuncName adalah nama yang tidak terdekorasi, dan _PlainFuncName@4 merupakan nama fungsi yang didekorasi:

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

Direktif #pragma berguna jika Anda perlu mengekspor nama fungsi yang tidak terdekorasi, dan memiliki ekspor yang berbeda tergantung pada konfigurasi build (misalnya, dalam build 32-bit atau 64-bit).

Keempat metode dapat digunakan dalam program yang sama. Saat LINK membangun program yang berisi ekspor, link juga membuat pustaka impor, kecuali jika . File EXP digunakan dalam build.

Berikut adalah contoh bagian EKSPOR:

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

Saat Anda mengekspor variabel dari DLL dengan menggunakan . File DEF, Anda tidak perlu menentukan __declspec(dllexport) variabel. Namun, dalam file apa pun yang menggunakan DLL, Anda masih harus menggunakan __declspec(dllimport) pada deklarasi data.

Baca juga

Aturan untuk Pernyataan Definisi Modul