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?
Eksportowanie z biblioteki DLL za pomocą __declspec(dllexport)
Eksportowanie funkcji C++ do użycia w plikach wykonywalnych w języku C