Sdílet prostřednictvím


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 .

O čem chcete vědět víc?

Viz také

Vytváření knihoven DLL jazyka C/C++ v sadě Visual Studio