Volání funkcí knihovny DLL z aplikací jazyka Visual Basic
Pro aplikace jazyka Visual Basic (nebo aplikace v jiných jazycích, jako je Pascal nebo Fortran) pro volání funkcí v knihovně DLL jazyka C/C++, musí být funkce exportovány pomocí správné konvence volání bez jakékoli dekorace názvů provedené kompilátorem.
__stdcall
vytvoří správnou konvenci volání pro funkci (volaná funkce vyčistí zásobník a parametry se předávají zprava doleva), ale vyzdobí název funkce jinak. Takže, pokud __declspec(dllexport)
se používá u exportované funkce v knihovně DLL, dekorovaný název se exportuje.
Název __stdcall
dekorace předpony symbolu podtržítkem ( _ ) a připojí symbol znakem znaku at (@) následovaný počtem bajtů v seznamu argumentů (požadované místo zásobníku). Výsledkem je, že funkce, která je deklarována jako:
int __stdcall func (int a, double b)
je dekorován jako _func@12
ve výstupu.
Konvence volání jazyka C (__cdecl
) zdobit název jako _func
.
Pokud chcete získat zdobený název, použijte příkaz /MAP. __declspec(dllexport)
Použití provede následující:
Pokud je funkce exportována pomocí konvence volání jazyka C (
__cdecl
), při exportu názvu odstraní úvodní podtržítko ( _ ).Pokud exportovaná funkce nepoužívá konvenci volání jazyka C (například
__stdcall
), exportuje zdobený název.
Vzhledem k tomu, že neexistuje způsob, jak přepsat, kde dochází k vyčištění zásobníku, je nutné použít __stdcall
. Chcete-li zrušit dekódování názvů pomocí __stdcall
, je nutné je zadat pomocí aliasů v oddílu EXPORT v souboru .def. Toto je znázorněno následujícím způsobem pro následující deklaraci funkce:
int __stdcall MyFunc (int a, double b);
void __stdcall InitCode (void);
V sadě . DEF soubor:
EXPORTS
MYFUNC=_MyFunc@12
INITCODE=_InitCode@0
Pro knihovny DLL, které mají být volána programy napsané v jazyce Visual Basic, alias technika zobrazená v tomto tématu je nutná v souboru .def. Pokud je alias proveden v programu Visual Basic, použití aliasingu v souboru .def není nutné. To lze provést v programu Visual Basic přidáním klauzule alias do příkazu Declare .