將使用 GetProcAddress() 的代碼從 C 導(dǎo)向 C++ 時(shí),MS-DOS 的 C++ 編譯器可能會(huì)返回以下錯(cuò)誤信息: error C2564:formal/actual parameters mismatch in call through pointer to function 32 位編譯器返回的錯(cuò)誤信息是: error C2197:'int (__stdcall *)(void )' :too many actual parameters 在一個(gè)傳統(tǒng)的 C 應(yīng)用程序中,使用 GetProcAddress() 獲取待調(diào)用函數(shù)的地址,聲明一個(gè) FARPROC 類型的變量,用 GetProcAddress() 返回的值初始化指針,然后通過指針調(diào)用函數(shù),如下所示: 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 編譯時(shí),在 WINDOWS.H 文件中將定義 FARPROC,如下所示: typedef int (CALLBACK* FARPROC)(); 將上述示例代碼轉(zhuǎn)換為 C++ 后,將出現(xiàn)類型不匹配錯(cuò)誤,這是因?yàn)?C 與 C++ 在解釋函數(shù)聲明中的空括號(hào)方面存在著根本的不同。C 中的函數(shù)聲明方式如下: int (*funcptr)(); 它聲明一個(gè)參數(shù)數(shù)目未知的函數(shù)。在 C++ 中,這一聲明卻表示一個(gè)不接受任何參數(shù)的函數(shù)。換言之,該語句在 C++ 中等價(jià)于: int (*funcptr)(void); 由于存在這一不同,在 C 中使用 FARPROC 類型的指針調(diào)用帶參數(shù)的函數(shù)時(shí),不會(huì)出現(xiàn)任何錯(cuò)誤。在 C++ 中,如果傳遞給 GetProcAddress() 的函數(shù)帶有參數(shù),即會(huì)出現(xiàn)形參/實(shí)參不匹配的錯(cuò)誤,因?yàn)?FARPROC 類型的函數(shù)被定義為不帶參數(shù)的函數(shù),而不是可接受參數(shù)的函數(shù)。
要消除該錯(cuò)誤,請(qǐng)將函數(shù)指針定義為指向具有正確參數(shù)數(shù)目的函數(shù)的指針,然后為 GetProcAddress() 的返回值分配相應(yīng)類型: 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); } }
--------------------------------------------------------------------------------
這篇文章中的信息適用于: • Microsoft Visual C++ 1.0 專業(yè)版 • Microsoft Visual C++ 2.0 Professional Edition • Microsoft Visual C++ 2.1 • Microsoft Visual C++ 4.0 標(biāo)準(zhǔn)版 • Microsoft Visual C++ 6.0 Service Pack 5 • Microsoft Visual C++ 5.0 標(biāo)準(zhǔn)版
|