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 ulDataInDll
iç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 ulDataInDll
yalnı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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin