概要 將使用 GetProcAddress() 的代碼從 C 導向 C++ 時,MS-DOS 的 C++ 編譯器可能會返回以下錯誤資訊: error C2564:formal/actual parameters mismatch in call through pointer to function 32 位編譯器返回的錯誤資訊是: error C2197:'int (__stdcall *)(void )' :too many actual parameters
更多資訊 在一個傳統的 C 應用程式中,使用 GetProcAddress() 擷取待調用函數的地址,聲明一個 FARPROC 類型的變數,用 GetProcAddress() 返回的值初始化指標,然後通過指標調用函數,如下所示:
void func1(void){ HINSTANCE hLib; FARPROC lpfnDLLProc; UINT param1 = 1; int param2; hLib = LoadLibrary ("dll1.dll"); if (hLib) { lpfnDLLProc = GetProcAddress (hLib, "DLLProc"); (*lpfnDLLProc) (param1, (LPINT)¶m2); FreeLibrary (hLib); }} 不使用 STRICT 編譯時間,在 WINDOWS.H 檔案中將定義 FARPROC,如下所示:
typedef int (CALLBACK* FARPROC)();
將上述範例程式碼轉換為 C++ 後,將出現類型不符錯誤,這是因為 C 與 C++ 在解釋函式宣告中的空括弧方面存在著根本的不同。C 中的函式宣告方式如下:
int (*funcptr)();
它聲明一個參數數目未知的函數。在 C++ 中,這一聲明卻表示一個不接受任何參數的函數。換言之,該語句在 C++ 中等價於:
int (*funcptr)(void);
由於存在這一不同,在 C 中使用 FARPROC 類型的指標調用帶參數的函數時,不會出現任何錯誤。在 C++ 中,如果傳遞給 GetProcAddress() 的函數帶有參數,即會出現形參/實參不匹配的錯誤,因為 FARPROC 類型的函數被定義為不帶參數的函數,而不是可接受參數的函數。
要消除該錯誤,請將函數指標定義為指向具有正確參數數目的函數的指標,然後為 GetProcAddress() 的傳回值分配相應類型:
typedef void (CALLBACK *ULPRET)(UINT,LPINT);void func1(void){ HINSTANCE hLib; ULPRET lpfnDLLProc; UINT param1 = 1; int param2; hLib = LoadLibrary ("dll1.dll"); if (hLib) { lpfnDLLProc = (ULPRET) GetProcAddress (hLib,"DLLProc"); (*lpfnDLLProc) (param1, (LPINT)¶m2); FreeLibrary (hLib); }}