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.