哪吒2之魔童闹海|哪吒2之魔童归来免费观看|哪吒2在线观看|哪吒2魔童闹海电影免费观看|哪吒2免费观看完整版大电影|哪吒1免费观看完整版

新疆軟件開發(fā)

本站首頁 軟件開發(fā) 成功案例 公司新聞 公司簡介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開發(fā)公司 >> 開發(fā)語言 >> 文章正文

將使用GetProcAddress 的代碼從C 導(dǎo)向C++ 時(shí)收到C2564 錯(cuò)誤或C2197 錯(cuò)誤

將使用 GetProcAddress() 的代碼從 C 導(dǎo)向 C++ 時(shí),MS-DOS 的 C++ 編譯器可能會返回以下錯(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)&param2);
      FreeLibrary (hLib);
   }
}
    
不使用 STRICT 編譯時(shí),在 WINDOWS.H 文件中將定義 FARPROC,如下所示: typedef int (CALLBACK* FARPROC)();
    
將上述示例代碼轉(zhuǎn)換為 C++ 后,將出現(xiàn)類型不匹配錯(cuò)誤,這是因?yàn)?C 與 C++ 在解釋函數(shù)聲明中的空括號方面存在著根本的不同。C 中的函數(shù)聲明方式如下: int (*funcptr)();
    
它聲明一個(gè)參數(shù)數(shù)目未知的函數(shù)。在 C++ 中,這一聲明卻表示一個(gè)不接受任何參數(shù)的函數(shù)。換言之,該語句在 C++ 中等價(jià)于: int (*funcptr)(void);
    
由于存在這一不同,在 C 中使用 FARPROC 類型的指針調(diào)用帶參數(shù)的函數(shù)時(shí),不會出現(xiàn)任何錯(cuò)誤。在 C++ 中,如果傳遞給 GetProcAddress() 的函數(shù)帶有參數(shù),即會出現(xiàn)形參/實(shí)參不匹配的錯(cuò)誤,因?yàn)?FARPROC 類型的函數(shù)被定義為不帶參數(shù)的函數(shù),而不是可接受參數(shù)的函數(shù)。

要消除該錯(cuò)誤,請將函數(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)&param2);
      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)版

 

作者:未知 | 文章來源:新疆二域軟件開發(fā) | 更新時(shí)間:2007-10-19 11:48:48

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    C++基礎(chǔ)知識:結(jié)構(gòu)體數(shù)據(jù)的指針變量
    如何實(shí)現(xiàn)C與C++程序的相互調(diào)用
    在C++中成員函數(shù)如何實(shí)現(xiàn)操作符重載?
    基礎(chǔ)學(xué)習(xí):C++非成員函數(shù)實(shí)現(xiàn)操作符重載
    基礎(chǔ)學(xué)習(xí):C++重載輸入輸出符
    基礎(chǔ)學(xué)習(xí):C++重載下標(biāo)結(jié)算符
    基礎(chǔ)學(xué)習(xí):C++中重載調(diào)用操作符
    基礎(chǔ)學(xué)習(xí):C++重載轉(zhuǎn)換操作符operator (type)
    C++類復(fù)制控制學(xué)習(xí)
    C++類析構(gòu)函數(shù)學(xué)習(xí)
    軟件技術(shù)
    · 開發(fā)語言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫開發(fā)
    最新文章  
    ·搜集整理的asp.net的驗(yàn)證方
    ·各種FOR循環(huán)結(jié)構(gòu)的整理
    ·軟件項(xiàng)目開發(fā)中應(yīng)該考慮那
    ·搜集整理的javascript sel
    ·軟件開發(fā)中項(xiàng)目經(jīng)理有那些
    ·學(xué)習(xí)如何在Lambda表達(dá)式進(jìn)
    ·C++基礎(chǔ)知識:結(jié)構(gòu)體數(shù)據(jù)的
    ·C#實(shí)現(xiàn)短信發(fā)送程序的例子
    ·sun最近修補(bǔ)了一部分java的
    ·rss定制的另外一種實(shí)現(xiàn)方式
    ·delphi實(shí)現(xiàn)利用arp欺騙來實(shí)
    ·基礎(chǔ)學(xué)習(xí):基于WF的流程框
    ·網(wǎng)絡(luò)編程中怎樣得知一次數(shù)
    ·如何逆序輸出單鏈表?
    ·軟件開發(fā)過程中的性能設(shè)計(jì)
    關(guān)于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開發(fā)網(wǎng) www.pg11qqq.com All Rights Reserved 新ICP備14003571號
    新疆軟件開發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000