從 Visual Basic 應用程式中呼叫 DLL 函式
為了讓 Visual Basic 應用程式 (或其他語言撰寫的應用程式,例如 Pascal 或 Fortran) 可以呼叫 C/C++ DLL 裡的函式,函式必須由編譯器在未使用任何名稱裝飾情況下使用正確呼叫慣例匯出。
__stdcall 會為函式建立正確的呼叫慣例 (呼叫函式清除堆疊並且由右至左傳遞參數),但以不同方式來修飾函式名稱。 因此,當 __declspec(dllexport) 用於 DLL 裡的匯出函式時,會匯出裝飾名稱。
__stdcall 名稱裝飾會以底線 (_) 附加在符號名稱之前,並且以 @ 字元附加於符號,這字元後面跟著引數清單裡的位元組數 (所需的堆疊空間)。 因此,當函式宣告為:
int __stdcall func (int a, double b)
就會裝飾成:
_func@12
C 呼叫慣例 (__cdecl) 將名稱裝飾為 _func。
若要取得裝飾名稱,使用 /MAP。 使用 __declspec(dllexport) 時會執行下列事項:
匯出函式時若是用到 C 呼叫慣例 (_cdecl),則名稱在匯出時會移除前置底線 (_)。
匯出函式時若未用到 C 呼叫慣例 (例如,__stdcall),便會匯出裝飾名稱。
因為沒有方法可以覆寫堆疊清除發生的地方,您必須使用 __stdcall。 若要以 __stdcall 取消裝飾名稱,您必須在 .def 檔的 EXPORTS 區段裡使用別名 (Alias) 來指定它們。 下列顯示函式宣告:
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 檔使用別名就不是必要的。 在 Declare 陳述式中加入別名子句,便可於 Visual Basic 程式裡完成。