VC++6.0转到VS2008常出现的错误及解决方案 下载本文

内容发布更新时间 : 2024/5/17 17:26:09星期一 下面是文章的全部内容请认真阅读。

刚从VC++6.0转到VS2008,用着好不习惯,网上找到一帖子,转给大家,希望会有帮助。

-------------------------------------------------------------------------------------------------- 首先在此引一例子

当源文件由vc++6.0转到vs2008时会出现如下错误:

错误一:error C2039: 'WriteHuge' : is not a member of 'CFile'\

解决方案:只有VC6有函数WriteHuge,VC7以上就没有了。用Write替换WriteHuge就可以解决问题。

1.MessageBox()

VC++6.0:MessageBox(\

VS2008:MessageBox(L\或 MessageBox(TEXT(\

2.Combo box内容添加方法

VC++6.0:Drop-Down List Box Control 的 Properties 中的 Data 用 Ctrl-Enter 输入

VS2008:更名为 Combo-Box Control ,并在右侧 Data 区域用 semicolons(即';')分隔输入

3.从.net开始就没有classwizard了,全部在属性窗口里了

属性窗口中有,闪电图标及右边的都是,包括事件,消息,虚函数重载,加入变量则是在类标上右击->添加变量??

4.消息映射

VS2005对消息的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2005下编译不通过

a,ON_MESSAGE(message,OnMyMessage);

OnMyMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

如果不符合,则有错误提示:

error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”

error C2440: “static_cast”: 无法从“void (__thiscall CPppView::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”

b,在VS2005中,OnMyMessage返回值必须为BOOL,且含有一个 UINT 参数指出了命令ID,其形式为:afx_msg BOOL OnMyMessage(UINT);如果不符合,则有错误提示. 如在VS6中,OnMyMessage2的定义为afx_msg BOOL OnViewZoomBar()时亦可正常编译通过,但在VS2005下,有错误提示:

error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”

error C2440: “static_cast”: 无法从“BOOL (__thiscall CMainFrame::* )(void)”转换为“BOOL (__thiscall CCmdTarget::* )(UINT)”

5.字符处理

在c中广泛使用的strcpy,strcat,strstr等等推荐使用更为安全strcpy_s,strcat_s,strstr_s等来代替.

6.数学函数检查

VS2005中,数学函数的参数检查更为严格,如pow(2, 45)会引起一个错误提示如下: error C2668: “pow”: 对重载函数的调用不明确

d:program filesmicrosoft visual studio 8vcincludemath.h(575): 可能是“long double pow(long double,int)”

d:program filesmicrosoft visual studio 8vcincludemath.h(527): 或“float pow(float,int)” d:program filesmicrosoft visual studio 8vcincludemath.h(489): 或“double pow(double,int)” 试图匹配参数列表“(int, int)”时 正确的使用为pow(2.0, 45)

7.更加符合C++标准

如在VS6中,在FOR循环中的循环变量的定义的作用域延伸到循环体外,VS2005则修正了这样的bug。 VC6:

for(int i=0;i<100;i++)f2();

for(i = 1;i<10;i++)f1(); //i已经定义

而有VS2005中,第二句的i必须重新定义

--------------------------------------------------------------------------------------------------------------------------------------------

直接用Visual Studio 2008的打开VC6的工作区文件和项目文件(dsw和dsp),并将其升级为VS2008的解决方案格式和项目格式(sln和vcproj),VC9的编译器相对于VC6有了很大的变化,一些编译参数和链接参数被废弃(比如/map:line),有一些改变了名称,还有新增的选项,不过不用担心,升级过程会自动对其进行转换,最终都会得到一个正确的解决方案和VC项目文件,这个过程不会遇到太多的麻烦,问题都出在随后的编译过程中,下面就将我在移植的过程中遇到的问题和我的解决方法总结一下,希望对还在用VC6维护代码的朋友有所帮助。

一、_WIN32_WINNT 与 _WIN32_IE 设置冲突

_WIN32_WINNT 与 _WIN32_IE设置不兼容会导致如下错误:

错误一:C1189致命错误:StdAfx.cpp

c:program filesmicrosoft sdkswindowsv6.0aincludesdkddkver.h(217) : fatal error C1189: #error : _WIN32_WINNT settings conflicts with _WIN32_IE setting

解决方案:StdAfx.cpp通常是项目中第一个编译的文件,这个错误将导致编译无法继续进行。产生这个错误的原因是原因是_WIN32_WINNT的版本定义太老,老的VC代码对_WIN32_WINNT的典型设置是:

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400 #endif

0x0400相对于VS2008所带的Plarform SDK(在文件sdkddkver.h中)中_WIN32_IE的定义来说太老了,导致不兼容,可以将其改成0x0501或更高的版本避免这个问题,如下所示:

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0501 #endif

也可以将这三行_WIN32_WINNT定义删除,这样就会使用Plarform SDK中的_WIN32_WINNT定义,自然就不存在不兼容问题了。不过出于对老版本VC的兼容考虑(毕竟以后可能还要使用VC6编译代码),最好这样修改:

#if _MSC_VER <= 1200 // MFC 6.0 or earlier #ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400 #endif #endif

二、afximpl.h文件中的语法错误

MFC出现的时候STL还没有成为C++的标准,所以MFC使用一套自己的模版库,比如CArray、CList、CMap等等,这些类型声明都在afximpl.h文件中。原来在VC6编译器适用的模版语法可能不适用VC9,特别是当以下四个环境变量设置不兼容时,就会出现这个编译错误,大致情况如下:

e:softwaremicrosoft visual studio 9.0vcatlmfcsrcmfcafximpl.h(625) : error C2059: syntax error : ''

e:softwaremicrosoft visual studio 9.0vcatlmfcsrcmfcafximpl.h(625) : error C2238: unexpected token(s) preceding ';'

e:softwaremicrosoft visual studio 9.0vcatlmfcsrcmfcafximpl.h(629) : error C2059: syntax error : ''

e:softwaremicrosoft visual studio 9.0vcatlmfcsrcmfcafximpl.h(629) : error C2238: unexpected