幾個VC6 0到VC9 0的錯誤解決方案

2022-03-25 01:27:50 字數 2677 閱讀 9694

幾個vc6.0到vc9.0的錯誤解決方案

技術研究

2008-04-12 13:21

字型大小: 大

說起現在這個引擎吧,總是沒有太多時間去寫,不過在半個月前就已經完成了,而且在vc6.0上是完全通過的,兩個demo的執行也完全正常,昨天學人家追追新流,一改往日的固執,裝了個vc9.0,結果出了幾十個warning,還有15個error,這些都是因為vc6.0到vc9.0的轉換上,還有處理規則有所變動產生了.如下是我的解決方案,希望對大家有所幫助,因為這個引擎目前還不到發布時間,所以不會有大量的原始碼帖出,敬請原諒:

1.c4430和c4996警告,因為我們是在/w3下debug,所以會出現好多這種warning,根據我的經驗,如果我們對自己的**和demo非常有信心的情況下,這些警告是多餘的,我們真正要去解決的是errors,所以我們先把warning全都去了,要不然看著讓人煩.....

方法非常簡單:  在命令列加入/wd4430 /wd4996,.....是不是非常簡單,

好了,現在把這幾十個warning的編譯資訊去掉後,看著就不煩了,心情好多了.留給我們接下來真正要解決的東西出如下:

2.error c2440: 'return' : 無法由 'void' 轉換為 'int'  : 

產生這種錯誤的原因吧,我開始也進入了誤區,我直接回頭去檢查**裡的return,浪費了不少時間,其實這個錯誤是因為,在standard c++程式庫中所執行的一致性和更新工作產生的.原始碼如下:

// 設定音效音量

inline  seteffectvolume(float fvolume)

//c2240

在standard c++下,是不會自動去轉換的,其實這不是我們**的問題,是vc7.0開始的乙個檢查更改,我們要做的就是迎合vc9.0就行,不必大幅改動我們的**部分,方案如下:

// 設定音效音量

void  seteffectvolume(float fvolume)

//it's ok.....

3. error c3867: 'myform::buttonctrlclick': 函式呼叫遺漏引數清單,請用 '&myform::buttonctrlclick' 建立成員的指標

其實這也是vs2005之後的乙個更變引起的.對vc++2005的編譯器完成一致性處理後也可能會產生這種錯誤:增強型成員指標一致性.

//**如下:

// panel2 setting

panel2.create(this, 545, 0, pan2bg);

buttongame.create(&panel2, 49, 128, btnbig, "遊戲性(g)");

buttongame.setdownoffset(-1, 3);

on_click(&buttongame, buttonctrlclick); //c3867

buttonvideo.create(&panel2, 49, 187, btnbig, "影象(v)");

buttonvideo.setdownoffset(-1, 3);

on_click(&buttonvideo, buttonctrlclick);//c3867

buttonsound.create(&panel2, 49, 246, btnbig, "聲音(s)");

buttonsound.setdownoffset(-1, 3);

on_click(&buttonsound, buttonctrlclick);//c3867

vs2005以後,在建立指標時,必須用&來建立和傳遞,哎,還真麻煩,不過這種較以往的會更安全.所以不要報怨,這種考慮是必要的.呵呵,微軟還挺周道的.不錯,小小表揚一下.如果用微軟給的方法來解決,很麻煩,我這人向來比較懶,所以我用的方法是,on_click(&buttonvideo, buttonctrlclick());//it's ok...

4.error c2440: '' : 無法由 'void' 轉換為 'geng::notifyfun'

我不廢話了,還是乙個return的檢查引起的問題.改吧....

可能性1:巨集定義在匯入vc9.0時順序換了位.在main.cpp前面加上巨集定義標頭檔案"geng_guiobj.h",錯誤依舊

可能性2:巨集定義裡位址傳遞上,方法不能在vc9.0裡體現.

typedef void (gengcontrol::*notifyfun)(void);  //定義部分**

struct notifyevent

notifyfun function;

gengcontrol *invoker;

}; //沒有型別轉換過程.....檢視控制項定義裡....

//控制項定義部分**:

#define on_click(obj, fun) /

在這裡,只有一種方法可行,也必須這麼改,如果沒有經驗的話,一般不知道如何下手.方案如下:

(obj*)->onclick.function = notifyfun(fun); /   //c2440

(obj*)->onclick.invoker = this; /

到此為止,終於成功地從vc6.0轉到了vc9.0上.

總結:其實vc的高版本改變往往是為了更安全,為了我們的程式在編譯成功後執行更建全考慮的,不要怕麻煩,不要一出錯就換低版本的,呵呵....

VC 6 0程式開啟檔案記憶體錯誤解決方法

症狀 使用vc6.0,新增檔案或開啟檔案,都出現0x5003eaed記憶體報錯,如下圖 這個問題存在很久了,只是影響不大沒理會,今天有時間上網搜了一下,終於找到解決辦法 微軟提供的解決方案 將該dll檔案拷貝到 x program files microsoft visual studio comm...

win socket程式設計下連線錯誤 VC6 0

在vc6.0下寫了乙個簡單的基於tcp的socket程式,但是在連線時出現如下錯誤 configuration tcpsrv win32 debug linking.main.obj error lnk2001 unresolved external symbol imp closesocket 4...

VC6 0迴圈的彙編

今天突然來了興趣,想看看彙編級的迴圈.include using namespace std int main 1 include 2 using namespace std 3 4 int main 5 00401290 jmp main 28h 00401278 11 12 00401292 p...