Dela via


Anropa DLL Functions från Visual Basic-program

För Visual Basic-program (eller program på andra språk som Pascal eller Fortran) för att anropa funktioner i en C/C++ DLL måste funktionerna exporteras med rätt anropskonvention utan någon namndekoration som gjorts av kompilatorn

__stdcall skapar rätt anropskonvention för funktionen (den anropade funktionen rensar stacken och parametrar skickas från höger till vänster) men dekorerar funktionsnamnet på ett annat sätt. Så, när __declspec(dllexport) används på en exporterad funktion i en DLL, exporteras det dekorerade namnet.

Namndekorationen __stdcall prefixar symbolnamnet med ett understreck ( _ ) och lägger till symbolen med ett tecken (@) följt av antalet byte i argumentlistan (det nödvändiga stackutrymmet). Det innebär att funktionen när den deklareras som:

int __stdcall func (int a, double b)

är dekorerad som _func@12 i resultatet.

C-anropskonventionen (__cdecl) dekorerar namnet som _func.

Använd /MAP för att hämta det dekorerade namnet. Användning av __declspec(dllexport) gör följande:

  • Om funktionen exporteras med C-anropskonventionen (__cdecl) tas det inledande understrecket ( _ ) bort när namnet exporteras.

  • Om funktionen som exporteras inte använder C-anropskonventionen (till exempel __stdcall), exporteras det dekorerade namnet.

Eftersom det inte finns något sätt att åsidosätta var stackrensningen sker måste du använda __stdcall. Om du vill avdekoda namn med __stdcallmåste du ange dem med hjälp av alias i avsnittet EXPORTer i .def-filen. Detta visas på följande sätt för följande funktionsdeklaration:

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

I .DEF-filen:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

För att DLL:er ska anropas av program som skrivits i Visual Basic krävs aliastekniken som visas i det här avsnittet i .def-filen. Om aliaset görs i Visual Basic-programmet är det inte nödvändigt att använda alias i .def-filen. Det kan göras i Visual Basic-programmet genom att lägga till en alias-sats i deklarera-instruktionen .

Vad vill du veta mer om?

Se även

Skapa DLL:er för C/C++ i Visual Studio