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?
Exportieren aus einer DLL mithilfe von __declspec(dllexport)
Exportieren von C++-Funktionen zur Verwendung in ausführbaren C-Dateien