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 __stdcallza 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?

Zobacz też

Tworzenie bibliotek DLL języka C/C++ w programie Visual Studio