Aracılığıyla paylaş


DEF Dosyalarını Kullanarak Alma

.def dosyasıyla birlikte __declspec(dllimport)'u kullanmayı seçerseniz, hatalı kodlamanın bir soruna neden olması olasılığını azaltmak amacıyla CONSTANT yerine DATA kullanmak için .def dosyasını değiştirmelisiniz.

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

Aşağıdaki tablo bunun neden olduğunu göstermektedir.

Anahtar Sözcük

İçe aktarma kütüphanesinde şunu yayar

Şunu dışa aktarır

CONSTANT

_imp_ulDataInDll_ulDataInDll

_ulDataInDll

DATA

_imp_ulDataInDll

_ulDataInDll

__declspec(dllimport) ve CONSTANT kullanmak hem imp sürümünü hem de açık bağlamaya izin vermek amacıyla oluşturulan .lib DLL içe aktarım kitaplığındaki bilgisi bulunmayan adını listeler. __declspec(dllimport) ve DATA kullanmak adın yalnızca imp sürümünü listeler.

CONSTANT'ı kullanırsanız, ulDataInDll'ye erişmek için aşağıdaki kod yapılarından herhangi biri kullanılabilir:

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

- veya -

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

Ancak, .def dosyanızda DATA kullanırsanız, yalnızca aşağıdaki tanımla derlenen kod ulDataInDll değişkenine erişebilir:

__declspec(dllimport) ULONG ulDataInDll;

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

CONSTANT kullanmak daha sakıncalıdır çünkü fazladan bir düzey dolaylı yok kullanmayı unutursanız, büyük olasılıkla değişkenin kendisine değil, içe aktarım adres tablosunun değişkene işaretçisine erişirsiniz. Bu tür bir sorun genelde erişim ihlali olarak bildirilebilir çünkü içe aktarım adres tablosu derleyici ve bağlayıcı tarafından salt okunur yapılmıştır.

Geçerli Visual C++ bağlayıcısı def dosyasında CONSTANT görürse bu sorun için uyarı verir. CONSTANT kullanmak için tek gerçek neden üstbilgi dosyasının prototipte __declspec(dllimport)'u listeleyemediği bazı nesne dosyalarını yeniden derleyememenizdir.

Ayrıca bkz.

Kavramlar

Uygulamanın İçine Aktarma