Udostępnij za pośrednictwem


Wywoływanie funkcji DLL z aplikacji języka Visual Basic

Aby aplikacje Visual Basic (lub aplikacje w innych językach, takich jak Fortran czy Pascal) mogły wywołać funkcje w bibliotece DLL C/C++, funkcje muszą zostać wyeksportowane przy użyciu poprawnej konwencji wywoływania, bez wykonywanego przez kompilator dekorowania nazw.

__stdcall tworzy poprawne konwencja wywołania funkcji (wywołana funkcja czyści stos i parametry są przekazywane od prawej do lewej), ale zdobi nazwy funkcji w inny sposób.Więc, gdy __declspec(dllexport) jest używany na funkcjach eksportowanych w bibliotece DLL, nazwa uzupełniona jest eksportowana.

Uzupełnianie nazwy __stdcall poprzedza nazwę symbolu ze znakiem podkreślenia (_) i dołącza symbol ze znakiem (@), po którym następuje liczba bajtów na liście argumentów (wymagany obszar stosu).W efekcie funkcja, gdy zadeklarowana jako:

int __stdcall func (int a, double b)

jest urządzony jako:

_func@12

Konwencja wywoływania C (__cdecl) rozszerza nazwę jako _func.

Aby uzyskać nazwę z atrybutami, użyj /MAP.Użycie __declspec(dllexport) ma następujące skutki:

  • Jeśli funkcja jest eksportowana z konwencją wywoływania C (_cdecl), usuwa wiodący znak podkreślenia (_), gdy nazwa jest eksportowana.

  • Jeśli eksportowana funkcja nie korzysta z konwencji wywoływania C (na przykład, __stdcall), eksportuje ona również nazwę uzupełnioną.

Ponieważ nie ma sposobu, aby nadpisać, gdzie występuje oczyszczanie stosu, należy użyć __stdcall.Aby zdjąć atrybuty z nazw __stdcall, musisz określić je używając aliasów w sekcji EXPORTS pliku .def.Jest to pokazana w poniższej deklaracji funkcji:

int  __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);

W pliku .DEF:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Aby biblioteki DLL były wywołane przez programy napisane w języku Visual Basic, plik .def musi wykorzystywać technikę aliasów omówioną w tym temacie.Jeśli alias został wykonany w programie Visual Basic, użycie aliasów w pliku .def nie jest konieczne.Można to zrobić w programie Visual Basic przez dodanie klauzuli aliasu do instrukcji Declare.

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Biblioteki DLL w programie Visual C++