Bagikan melalui


Mengekspor dari DLL Menggunakan File DEF

File definisi modul atau DEF (*.def) adalah file teks yang berisi satu atau beberapa pernyataan modul yang menjelaskan berbagai atribut DLL. Jika Anda tidak menggunakan __declspec(dllexport) kata kunci untuk mengekspor fungsi DLL, DLL memerlukan file DEF.

File DEF minimal harus berisi pernyataan definisi modul berikut:

  • Pernyataan pertama dalam file harus pernyataan LIBRARY. Pernyataan ini mengidentifikasi file DEF sebagai milik DLL. Pernyataan LIBRARY diikuti dengan nama DLL. Linker menempatkan nama ini di pustaka impor DLL.

  • Pernyataan EXPORTS mencantumkan nama dan, secara opsional, nilai ordinal fungsi yang diekspor oleh DLL. Anda menetapkan nilai ordinal fungsi dengan mengikuti nama fungsi dengan tanda (@) dan angka. Saat Anda menentukan nilai ordinal, nilai tersebut harus berada dalam rentang 1 hingga N, di mana N adalah jumlah fungsi yang diekspor oleh DLL. Jika Anda ingin mengekspor fungsi menurut ordinal, lihat Mengekspor Fungsi dari DLL berdasarkan Ordinal Daripada berdasarkan Nama serta topik ini.

Misalnya, DLL yang berisi kode untuk mengimplementasikan pohon pencarian biner mungkin terlihat seperti berikut ini:

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

Jika Anda menggunakan MFC DLL Wizard untuk membuat DLL MFC, wizard membuat file DEF kerangka untuk Anda dan secara otomatis menambahkannya ke proyek Anda. Tambahkan nama fungsi yang akan diekspor ke file ini. Untuk DLL non-MFC, buat sendiri file DEF dan tambahkan ke proyek Anda. Kemudian buka >File Definisi Modul Input>Project Properties>Linker>dan masukkan nama file DEF. Ulangi langkah ini untuk setiap konfigurasi dan platform, atau lakukan semuanya sekaligus dengan memilih Konfigurasi = Semua Konfigurasi, dan Platform = Semua Platform.

Jika Anda mengekspor fungsi dalam file C++, Anda harus menempatkan nama yang didekorasi dalam file DEF atau menentukan fungsi yang diekspor dengan tautan C standar dengan menggunakan ekstern "C". Jika Anda perlu menempatkan nama yang didekorasi dalam file DEF, Anda dapat memperolehnya dengan menggunakan alat DUMPBIN atau dengan menggunakan opsi linker /MAP . Perhatikan bahwa nama yang didekorasi yang diproduksi oleh pengkompilasi spesifik. Jika Anda menempatkan nama yang didekorasi yang dihasilkan oleh pengkompilasi Microsoft C++ (MSVC) ke dalam file DEF, aplikasi yang menautkan ke DLL Anda juga harus dibangun menggunakan versi MSVC yang sama sehingga nama yang didekorasi dalam aplikasi panggilan cocok dengan nama yang diekspor dalam file DEF DLL.

Catatan

DLL yang dibangun dengan Visual Studio 2015 dapat digunakan oleh aplikasi yang dibangun dengan Visual Studio 2017 atau Visual Studio 2019.

Jika Anda membangun DLL ekstensi, dan mengekspor menggunakan file DEF, letakkan kode berikut di awal dan akhir file header Anda yang berisi kelas yang diekspor:

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

Baris ini memastikan bahwa variabel MFC yang digunakan secara internal atau yang ditambahkan ke kelas Anda diekspor (atau diimpor) dari DLL ekstensi MFC Anda. Misalnya, saat mengambil kelas menggunakan DECLARE_DYNAMIC, makro diperluas untuk menambahkan CRuntimeClass variabel anggota ke kelas Anda. Keluar dari empat baris ini dapat menyebabkan DLL Anda salah mengkompilasi atau menautkan atau menyebabkan kesalahan saat aplikasi klien menautkan ke DLL.

Saat membuat DLL, linker menggunakan file DEF untuk membuat file ekspor (.exp) dan file pustaka impor (.lib). Linker kemudian menggunakan file ekspor untuk membangun file DLL. Executable yang secara implisit menautkan ke tautan DLL ke pustaka impor saat dibuat.

Perhatikan bahwa MFC sendiri menggunakan file DEF untuk mengekspor fungsi dan kelas dari MFCx0.dll.

Apa yang ingin Anda lakukan?

Apa yang ingin Anda ketahui lebih lanjut?

Lihat juga

Mengekspor dari DLL