Visual Basic Uygulamasından DLL İşlevi Çağırma
Visual Basic uygulamaları için (veya Pascal ya da Fortran gibi diğer dillerdeki uygulamalarda) bir C/C++ DLL'deki işlevleri çağırmak için, işlevler derleyici tarafından yapılan herhangi bir ad düzenleme olmadan doğru çağrı kuralı kullanarak dışarı aktarılmalıdır.
__stdcall, işlev için doğru çağrı kuralını oluşturur (çağırılan işlev yığını temizler ve parametreler sağdan sola geçirilir) ancak işlev adını farklı şekilde düzenler. Bu nedenle, DLL'deki dışarı aktarılmış bir işlevde __declspec(dllexport) kullanıldığında düzenlenmiş ad dışarı aktarılır.
__stdcall ad süslemesi, simge adının önüne bir altçizgi(_) getirir ve simgenin sonuna bir at işareti (@) karakteri ve ardından bağımsız değişken listesindeki baytların sayısını ekler (gerekli yığın boşluğu) Sonuç olarak, şu şekilde bildirildiğinde, işlev:
int __stdcall func (int a, double b)
şöyle tasarlanmıştır:
_func@12
C çağırma kuralı (__cdecl), adı _func olarak süsler.
Düzenlenmiş adı almak için /EŞLEME öğesini kullanın. __declspec(dllexport) öğesinin kullanımı aşağıdakini yapar:
İşlev C çağırma kuralı ile birlikte dışarı aktarılıyorsa (_cdecl), ad dışarı aktarılırken altçizgiyi (_) kaldırır.
Dışarı aktarılan işlev C çağırma kuralı kullanmıyorsa (örneğin, __stdcall), işlev düzenlenmiş adı dışarı aktarır.
Yığın temizlemenin oluştuğu yerde geçersiz kılmanın bir yolu olmadığı için, __stdcall kullanmalısınız. Adların __stdcall öğesiyle bilgilerini kaldırmak için .def dosyasının EXPORTS bölümünde diğer adlar kullanarak bu adları belirtmeniz gerekir. Bu, aşağıdaki işlev bildirimi için aşağıdaki gibi gösterilmiştir:
int __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);
.DEF dosyasında:
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Visual Basic'te yazılmış programlar tarafından çağrılacak DLL dosyaları için bu konuda gösterilen diğer teknik .def dosyası gereklidir. Diğer adlar Visual Basic programında yapıldıysa, .def dosyasında diğer adlandırma kullanımı gerekli değildir. Declare deyimine diğer ad yan tümcesi ekleyerek Visual Basic programında yapılabilir.