Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.