Aracılığıyla paylaş


DEF Dosyalarını Kullanarak İçeri Aktarma

Bir .def dosyasıyla birlikte kullanmayı __declspec(dllimport) seçerseniz, hatalı kodlamanın soruna neden olma olasılığını azaltmak için .def dosyasını CONSTANT yerine DATA kullanacak şekilde değiştirmeniz gerekir:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

Aşağıdaki tabloda bunun nedeni gösterilmektedir.

Anahtar sözcük İçeri aktarma kitaplığında yayar Dışarı aktarmalar
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

ve __declspec(dllimport) CONSTANT kullanıldığında, açık bağlamaya imp izin vermek için oluşturulan .lib DLL içeri aktarma kitaplığındaki hem sürüm hem de sıralanmamış ad listelenir. ve __declspec(dllimport) DATA kullanarak yalnızca imp adın sürümü listelenir.

CONSTANT kullanıyorsanız, aşağıdaki kod yapılarından biri öğesine erişmek ulDataInDlliçin kullanılabilir:

__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L)   /*sample code fragment*/

-veya-

ULONG *ulDataInDll;      /*prototype*/
if (*ulDataInDll == 0L)  /*sample code fragment*/

Bununla birlikte, .def dosyanızda DATA kullanırsanız, değişkenine ulDataInDllyalnızca aşağıdaki tanım ile derlenmiş kod erişebilir:

__declspec(dllimport) ULONG ulDataInDll;

if (ulDataInDll == 0L)   /*sample code fragment*/

SABIT kullanmak daha risklidir, çünkü ek dolaylılık düzeyini kullanmayı unutursanız, içeri aktarma adresi tablosunun değişkenin kendisine değil değişkenin işaretçisine erişebilirsiniz. İçeri aktarma adresi tablosu şu anda derleyici ve bağlayıcı tarafından salt okunur yapıldığından, bu tür bir sorun genellikle erişim ihlali olarak bildirilebilir.

Geçerli MSVC bağlayıcısı, bu durumu hesaba eklemek için .def dosyasında CONSTANT görürse bir uyarı oluşturur. CONSTANT kullanmanın tek gerçek nedeni, üst bilgi dosyasının prototipte listelenmediği __declspec(dllimport) bir nesne dosyasını yeniden derleyemezsiniz.

Ayrıca bkz.

Bir Uygulamaya Aktarma