從 Visual Basic 應用程式中呼叫 DLL 函式

若為 Visual Basic 應用程式(或 Pascal 或 Fortran 等其他語言的應用程式)在 C/C++ DLL 中呼叫函式,則必須使用正確的呼叫慣例匯出函式,而不需編譯器完成任何名稱裝飾

__stdcall 會建立函式的正確呼叫慣例(呼叫的函式會從右至左傳遞堆疊和參數),但會以不同的方式裝飾函式名稱。 因此,在 DLL 中匯出的函式上使用 時 __declspec(dllexport) ,會匯出裝飾名稱。

名稱裝飾會在 __stdcall 符號名稱前面加上底線( _ ),並以符號 ( @ ) 字元附加符號,後面接著引數清單中的位元組數目(必要的堆疊空間)。 因此,當宣告為:

int __stdcall func (int a, double b)

在輸出中會裝飾為 _func@12

C 呼叫慣例 ( __cdecl ) 會將名稱裝飾為 _func

若要取得裝飾的名稱,請使用 /MAP __declspec(dllexport)使用 會執行下列動作:

  • 如果函式是以 C 呼叫慣例匯出, __cdecl 則會在匯出名稱時,將前置底線 ( _ ) 等量。

  • 如果匯出的函式未使用 C 呼叫慣例(例如, __stdcall ),則會匯出裝飾名稱。

因為無法覆寫堆疊清除發生的位置,因此您必須使用 __stdcall 。 若要使用 __stdcall 取消編碼名稱,您必須在 .def 檔案的 [匯出] 區段中使用別名來指定名稱。 下列函式宣告如下所示:

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

在。DEF 檔案:

EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

若要讓以 Visual Basic 撰寫的程式呼叫 DLL,本主題中顯示的別名技術需要 .def 檔案中。 如果在 Visual Basic 程式中完成別名,就不需要在 .def 檔案中使用別名。 您可以將 alias 子句新增至 Declare 語句,以在 Visual Basic 程式中完成。

您還想知道關於哪些方面的詳細資訊?

另請參閱

在 Visual Studio 中建立 C++ DLL