Aracılığıyla paylaş


kullanarak işlev çağrılarını içeri aktarma __declspec(dllimport)

kullanarak __declspec(dllimport) çağrılara ek açıklama eklenerek çağrılar daha hızlı yapılabilir. __declspec(dllimport) dışarı aktarılan DLL verilerine erişmek için her zaman gereklidir.

DLL'den işlev içeri aktarma

Aşağıdaki kod örneği, bir DLL'den uygulamaya işlev çağrılarını içeri aktarmak için nasıl kullanılacağını __declspec(dllimport) gösterir. func1 Bunun, ana işlevi içeren yürütülebilir dosyadan ayrı bir DLL'de bulunan bir işlev olduğunu varsayalım.

olmadan __declspec(dllimport), şu koda göre:

int main(void)
{
   func1();
}

derleyicisi şuna benzer bir kod oluşturur:

call func1

bağlayıcı, çağrıyı şöyle bir şeye çevirir:

call 0x4000000         ; The address of 'func1'.

Başka bir DLL'de varsa func1 , bağlayıcı bu adresi doğrudan çözümleyemez çünkü adresinin ne olduğunu bilmenin func1 bir yolu yoktur. 32 bit ve 64 bit ortamlarda bağlayıcı, bilinen bir adreste bir thunk oluşturur. 32 bitlik bir ortamda thunk şöyle görünür:

0x40000000:    jmp DWORD PTR __imp_func1

Yürütülebilir dosyanın içeri aktarma adresi tablosundaki yuvanın adresi func1 aşağıdadır__imp_func1. Tüm bu adresler bağlayıcı tarafından bilinir. Her şeyin düzgün çalışması için yükleyicinin yalnızca yükleme zamanında yürütülebilir dosyanın içeri aktarma adresi tablosunu güncelleştirmesi gerekir.

Bu nedenle kullanmak __declspec(dllimport) daha iyidir: çünkü bağlayıcı gerekli değilse bir thunk oluşturmaz. Thunks kodu büyütür (RISC sistemlerinde çeşitli yönergeler olabilir) ve önbellek performansınızı düşürebilir. Derleyiciye işlevin bir DLL'de olduğunu söylerseniz, sizin için dolaylı bir çağrı oluşturabilir.

Şimdi şu kod:

__declspec(dllimport) void func1(void);
int main(void)
{
   func1();
}

şu yönergeyi oluşturur:

call DWORD PTR __imp_func1

Thunk ve yönerge olmadığından jmp kod daha küçük ve hızlıdır. Tüm program iyileştirmesini kullanmadan da aynı etkiyi __declspec(dllimport) elde edebilirsiniz. Daha fazla bilgi için bkz . /GL (Tüm Program İyileştirme).

DLL içindeki işlev çağrıları için dolaylı çağrı kullanmak zorunda değilsiniz. Bağlayıcı işlevin adresini zaten biliyor. Dolaylı çağrıdan önce işlevin adresini yüklemek ve depolamak için fazladan zaman ve alan gerekir. Doğrudan çağrı her zaman daha hızlı ve daha küçüktür. Yalnızca DLL işlevlerini DLL'nin dışından çağırırken kullanmak __declspec(dllimport) istiyorsunuz. Bu DLL'i oluştururken DLL'nin içindeki işlevlerde kullanmayın __declspec(dllimport) .

Ayrıca bkz.

Bir Uygulamaya Aktarma