從 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 程式中完成。