Wywoływanie funkcji DLL z aplikacji języka Visual Basic
W przypadku aplikacji Języka Visual Basic (lub aplikacji w innych językach, takich jak Pascal lub Fortran), aby wywoływać funkcje w biblioteki DLL języka C/C++, funkcje muszą być eksportowane przy użyciu poprawnej konwencji wywoływania bez żadnych dekoracji nazw wykonanych przez kompilator
__stdcall
Tworzy poprawną konwencję wywoływania dla funkcji (wywoływana funkcja czyści stos i parametry są przekazywane od prawej do lewej), ale udekoruje nazwę funkcji inaczej. Dlatego w przypadku __declspec(dllexport)
użycia w wyeksportowanej funkcji w bibliotece DLL nazwa ozdobiona jest eksportowana.
Nazwa dekoracja __stdcall
prefiksuje nazwę symbolu ze znakiem podkreślenia ( _ ) i dołącza symbol znakiem at (), po którym następuje liczba bajtów na liście argumentów (@wymagane miejsce stosu). W związku z tym funkcja, gdy jest zadeklarowana jako:
int __stdcall func (int a, double b)
element jest ozdobiony jako _func@12
w danych wyjściowych.
Konwencja wywoływania języka C (__cdecl
) dekoruje nazwę jako _func
.
Aby uzyskać nazwę ozdobioną, użyj / MAP. __declspec(dllexport)
W tym celu należy wykonać następujące czynności:
Jeśli funkcja jest eksportowana z konwencją wywoływania języka C (
__cdecl
), usuwa wiodące podkreślenie ( _ ) podczas eksportowania nazwy.Jeśli eksportowana funkcja nie używa konwencji wywoływania języka C (na przykład
__stdcall
), eksportuje nazwę ozdobioną.
Ponieważ nie ma możliwości zastąpienia miejsca, w którym odbywa się oczyszczanie stosu, należy użyć polecenia __stdcall
. Aby nie tworzyć nazw __stdcall
za pomocą polecenia , należy określić je przy użyciu aliasów w sekcji EKSPORTy pliku .def. Poniżej przedstawiono następującą deklarację funkcji:
int __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);
W. Plik DEF:
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Aby biblioteki DLL wywoływane przez programy napisane w Visual Basic, potrzebna jest technika aliasu przedstawiona w tym temacie w pliku def. Jeśli alias jest wykonywany w programie Visual Basic, użycie aliasu w pliku .def nie jest konieczne. Można to zrobić w programie Visual Basic, dodając klauzulę aliasu do instrukcji Declare .
Co chcesz dowiedzieć się więcej?
Eksportowanie z biblioteki DLL przy użyciu polecenia . Pliki DEF
Eksportowanie z biblioteki DLL przy użyciu biblioteki __declspec(dllexport)
Eksportowanie funkcji języka C++ do użycia w plikach wykonywalnych języka C
Zobacz też
Tworzenie bibliotek DLL języka C/C++ w programie Visual Studio