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.