Aufrufen von DLL-Funktionen aus Visual Basic-Anwendungen heraus

Damit Visual Basic-Anwendungen (oder Anwendungen in anderen Sprachen wie Pascal oder Fortran) Funktionen in einer C-/C++-DLL aufrufen können, müssen die Funktionen mit der richtigen Aufrufkonvention exportiert werden, ohne dass der Compiler Namensergänzungen vornimmt.

__stdcall erstellt zwar die richtige Aufrufkonvention für die Funktion (die aufgerufene Funktion bereinigt den Stapel, und die Parameter werden von rechts nach links übergeben), der Funktionsname wird jedoch unterschiedlich ergänzt. Wenn __declspec(dllexport) daher für eine exportierte Funktion in einer DLL verwendet wird, wird der ergänzte Name exportiert.

Die __stdcall Namensdeko präfixt den Symbolnamen mit einem Unterstrich ( _ ) und fügt das Symbol mit einem At-Zeichen (@) gefolgt von der Anzahl der Bytes in der Argumentliste (das erforderliche Stapelzeichen) an. Ist daher eine Funktion wie folgt deklariert:

int __stdcall func (int a, double b)

In diesem Fall wird dies in der Ausgabe als _func@12 dekoriert.

Durch die C-Aufrufkonvention (__cdecl) wird der Name um _func ergänzt.

Verwenden Sie /MAP, um den dekorierten Namen zu ermitteln. Durch Verwendung von __declspec(dllexport) wird Folgendes ausgeführt:

  • Wenn die Funktion mit der C-Aufrufkonvention__cdecl () exportiert wird, wird beim Exportieren des Namens der führende Unterstrich ( _ ) entfernt.

  • Wenn die exportierte Funktion nicht die C-Aufrufkonvention (z. B. __stdcall) verwendet, wird der ergänzte Name exportiert.

Da es keine Möglichkeit gibt, die Stapelbereinigung an einer bestimmten Stelle zu überschreiben, muss __stdcall verwendet werden. Um eine Namensergänzung mit __stdcall rückgängig zu machen, müssen Sie die Namen im EXPORTS-Abschnitt der DEF-Datei mittels Aliasen angeben. Dies wird anhand der folgenden Funktionsdeklaration veranschaulicht:

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

In der DEF-Datei:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

Damit DLLs durch Programme in Visual Basic aufgerufen werden können, wird die in diesem Artikel erwähnte Aliastechnik in der DEF-Datei benötigt. Wenn das Aliasing im Visual Basic-Programm durchgeführt wird, ist es in der DEF-Datei nicht notwendig. Zu diesem Zweck wird der Declare-Anweisung im Visual Basic-Programm eine Aliasklausel hinzugefügt.

Worüber möchten Sie mehr erfahren?

Siehe auch

Erstellen von C/C++-DLLs in Visual Studio