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.
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