GetProcAddress 的代碼從 C 導向 C++ 的不同__C++

來源:互聯網
上載者:User
概要 將使用 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)&param2);      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)&param2);      FreeLibrary (hLib);   }}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.