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

pro aplikace Visual Basic (nebo aplikací v jiných jazycích, jako je Pascal nebo Fortran) volání funkcí v knihovně DLL jazyka C/C++, je nutné tyto funkce exportovat pomocí správné konvence volání bez jakýchkoli názvů, které provádí kompilátor.

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

__stdcallDekorování názvů má předponu názvu symbolu podtržítkem ( __stdcall ) a připojí symbol pomocí znaku ' symbol ' ( @ ) následovaný počtem bajtů v seznamu argumentů (požadované místo v zásobníku). V důsledku toho je funkce deklarována jako:

int __stdcall func (int a, double b)

je upraven jako _func@12 ve výstupu.

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

Chcete-li získat dekorovaný název, použijte /map. Použijte __declspec(dllexport) následující:

  • Pokud je funkce exportována pomocí konvence volání jazyka C ( __cdecl ), při exportu názvu odstraní počáteční podtržítko ( __cdecl ).

  • Pokud funkce, která je exportována, nepoužívá konvenci volání jazyka C (například __stdcall ), exportuje upravený název.

Vzhledem k tomu, že neexistuje žádný způsob, jak přepsat, kde dojde k vyčištění zásobníku, je nutné použít __stdcall . Chcete-li Neupravovat názvy pomocí __stdcall , je nutné je zadat pomocí aliasů v části EXPORTS v souboru. def. To je znázorněno následovně pro následující deklaraci funkce:

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

V. DEF soubor:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

aby byly knihovny dll volány programy napsanými v Visual Basic, je v souboru. def nutná metoda aliasů uvedená v tomto tématu. pokud se alias provádí v Visual Basic programu, není nutné použít aliasing v souboru. def. lze ji provést v programu Visual Basic přidáním klauzule alias do příkazu Declare .

K čemu chcete získat další informace?

Viz také

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