Mengimpor Menggunakan File DEF
Jika Anda memilih untuk menggunakan __declspec(dllimport)
bersama dengan file .def, Anda harus mengubah file .def untuk menggunakan DATA sebagai pengganti CONSTANT untuk mengurangi kemungkinan bahwa pengkodean yang salah akan menyebabkan masalah:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
Tabel berikut ini memperlihatkan alasannya.
Kata kunci | Memancarkan di pustaka impor | Ekspor |
---|---|---|
CONSTANT |
_imp_ulDataInDll , _ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
Menggunakan __declspec(dllimport)
dan CONSTANT mencantumkan imp
versi dan nama yang tidak terdekorasi di pustaka impor DLL .lib yang dibuat untuk memungkinkan penautan eksplisit. Menggunakan __declspec(dllimport)
dan DATA hanya mencantumkan imp
versi nama.
Jika Anda menggunakan CONSTANT, salah satu konstruksi kode berikut dapat digunakan untuk mengakses ulDataInDll
:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L) /*sample code fragment*/
-atau-
ULONG *ulDataInDll; /*prototype*/
if (*ulDataInDll == 0L) /*sample code fragment*/
Namun, jika Anda menggunakan DATA dalam file .def, hanya kode yang dikompilasi dengan definisi berikut yang dapat mengakses variabel ulDataInDll
:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
Menggunakan CONSTANT lebih berisiko karena jika Anda lupa menggunakan tingkat tidak langsung tambahan, Anda berpotensi mengakses pointer tabel alamat impor ke variabel — bukan variabel itu sendiri. Jenis masalah ini sering dapat bermanifestasi sebagai pelanggaran akses karena tabel alamat impor saat ini dibuat baca-saja oleh pengkompilasi dan linker.
Linker MSVC saat ini mengeluarkan peringatan jika melihat CONSTANT dalam file .def untuk memperhitungkan kasus ini. Satu-satunya alasan nyata untuk menggunakan CONSTANT adalah jika Anda tidak dapat mengkombinasikan ulang beberapa file objek di mana file header tidak tercantum __declspec(dllimport)
pada prototipe.