Sdílet prostřednictvím


Volání funkcí knihovny DLL z aplikací jazyka Visual Basic

Chcete-li, aby aplikace Visual Basic (nebo aplikace v jiných jazycích, jako například Pascal nebo Fortran) volaly funkce v knihovně DLL jazyka C/C++, funkce musí být exportovány pomocí správné konvence volání bez jakékoli úpravy názvu provedené kompilátorem.

__stdcall vytvoří správnou konvenci volání funkce (volaná funkce vyčistí zásobník a parametry jsou předány zprava doleva), ale název funkce upraví odlišně.Pokud je tedy použit __declspec(dllexport) na exportovanou funkci v knihovně DLL, upravený název je exportován.

Úprava názvu __stdcall přidá před název symbol podtržítka (_) a připojí symbol zavináč (@) následovaný počtem bajtů v seznamu argumentů (požadované místo v zásobníku).Výsledkem je funkce deklarovaná jako:

int __stdcall func (int a, double b)

je upravena následovně:

_func@12

Konvence volání jazyka C (__cdecl) upraví název jako _func.

Chcete-li získat upravený název, použijte /MAP.Použití __declspec(dllexport) provede následující akce:

  • Pokud je funkce exportována spolu s konvencí volání jazyka C (_cdecl), při exportu názvu odstraní počáteční podtržítko (_).

  • Pokud je funkce exportována bez konvence volání jazyka C (například __stdcall), exportuje upravený název.

Protože neexistuje žádný způsob, jak přepsat, kde dojde k vymazání zásobníku, musíte použít __stdcall.Chcete-li odstranit úpravy názvů pomocí __stdcall, je nutné je zadat pomocí aliasů v oddíle EXPORTS v souboru .def.To je ukázáno pro následující deklarace funkce takto:

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

V souboru .def:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Pro knihovny DLL, které jsou volány programy napsanými v jazyce Visual Basic, je potřeba použít v souboru .def techniku "alias", uvedenou v tomto tématu.Pokud se alias provede v programu Visual Basic, není nutné jeho použití v souboru .def.Toto lze provést, pokud v programu Visual Basic přidáte klauzuli alias do příkazu Declare.

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

Viz také

Koncepty

Knihovny DLL v jazyce Visual C++