Sdílet prostřednictvím


Volání funkcí knihovny DLL z aplikací 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, která je provedena 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ě. Takže pokud je 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 podtržítko (_) a připojí symbol "zavináč" (@) následovaný počtem bajtů v seznamu argumentů (požadované místo v zásobníku). Když je funkce deklarována takto:

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í vedoucí znak 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 obejít, pokud dojde k vymazání zásobníku, musíte použít __stdcall. Chcete-li odstaranit úpravy názvů pomocí __stdcall, je nutné je zadat pomocí aliasů v oddíle EXPORTS v souboru .def. To je ukázáno takto pro následující deklarace funkce:

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é 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.

Co chcete vědět více?

Viz také

Koncepty

Knihovny DLL