版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.messagebox() vc+6.0:messagebox(hello,world!); vs2008:messagebox(lhello,world!); 或 messagebox(text(hello,world!); 2.combo box内容添加方法 vc+6.0:drop-down list box control 的 properties 中的 data 用 ctrl-enter 输入 vs2008:更名为 combo-box control ,并在右侧 data 区域用 semicolons(即;)分隔输入 3.从.net开始就没有classwizard了,全部在属性窗口里
2、了 属性窗口中有,闪电图标及右边的都是,包括事件,消息,虚函数重载,加入变量则是在类标上右击-添加变量 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,
3、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的定义为af
4、x_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,str
5、cat,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):
6、 或“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;i100;i+)f2();for(i = 1;i10;i+)f1(); /i已经定义 而有vs2005中,第二句的i必须重新定义-直
7、接用visual studio 2008的打开vc6的工作区文件和项目文件(dsw和dsp),并将其升级为vs2008的解决方案格式和项目格式(sln和vcproj),vc9的编译器相对于vc6有了很大的变化,一些编译参数和链接参数被废弃(比如/map:line),有一些改变了名称,还有新增的选项,不过不用担心,升级过程会自动对其进行转换,最终都会得到一个正确的解决方案和vc项目文件,这个过程不会遇到太多的麻烦,问题都出在随后的编译过程中,下面就将我在移植的过程中遇到的问题和我的解决方法总结一下,希望对还在用vc6维护代码的朋友有所帮助。一、_win32_winnt 与 _win32_ie 设
8、置冲突 _win32_winnt 与 _win32_ie设置不兼容会导致如下c1189致命错误:stdafx.cppc:program filesmicrosoft sdkswindowsv6.0aincludesdkddkver.h(217) : fatal error c1189: #error :_win32_winnt settings conflicts with _win32_ie settingstdafx.cpp通常是项目中第一个编译的文件,这个错误将导致编译无法继续进行。产生这个错误的原因是原因是_win32_winnt的版本定义太老,老的vc代码对_win32_winnt的
9、典型设置是:#ifndef _win32_winnt#define _win32_winnt 0x0400#endif0x0400相对于vs2008所带的plarform sdk(在文件sdkddkver.h中)中_win32_ie的定义来说太老了,导致不兼容,可以将其改成0x0501或更高的版本避免这个问题,如下所示:#ifndef _win32_winnt#define _win32_winnt 0x0501#endif也可以将这三行_win32_winnt定义删除,这样就会使用plarform sdk中的_win32_winnt定义,自然就不存在不兼容问题了。不过出于对老版本vc的兼容考
10、虑(毕竟以后可能还要使用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:softw
11、aremicrosoft 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:s
12、oftwaremicrosoft visual studio 9.0vcatlmfcsrcmfcafximpl.h(629) : error c2238: unexpected token(s) preceding ;合理调整stdafx.h中winver、_win32_winnt、_win32_windows和_win32_ie的设置可以避免这个问题,将三个与windows版本有关的环境变量设置为0x0501或更高版本,将ie版本的环境变量设置为0x0500以后的版本就可以解决这个问题。当然,考虑到与旧的vc6代码兼容,可以采用上一个问题中提到的最后一个解决办法,用_msc_ver进行隔离。
13、三、 旧的crt库和新的安全crt库引起的c4996告警 解决了环境变量设置不匹配导致的问题后,编译过程就真正开始了,不过首先映入眼帘的应该是成堆的c4996编译告警,对每个使用了含字符串参数的crt库函数都会有c4996编译告警,一个典型的输出如下所示:f:monfunc.cpp(280) : warning c4996: strcpy: this function or variable may be unsafe. consider using strcpy_s instead. to disable deprecation, use _crt_secure_no_
14、warnings. see online help for details.e:softwaremicrosoft visual studio 9.0vcincludestring.h(74) : see declaration of strcpy msdn online 是这样解释的:为了显著增加crt库的安全性,许多crt函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。只要一个crt函数有新的安全版本,编译器就会产生一个c4996告警,不过,出现这个告警的目的并不是说旧版本的crt函数将淡出crt库,告警出现只是为了提醒程序员这个函数有更安全的版本存在。
15、一种安全的或者是被鼓励的做法是用安全版本的函数替换现有的crt函数,不过对于一个有相当代码量的项目,替换工作量也是巨大的,这可不是用名称查找、替换就能简单解决的问题,因为许多安全版本的crt函数参数个数也发生了变化。也可以用预处理指令消除这个告警:#pragma warning( disable : 4996 )或者定义 _crt_secure_no_warnings 压制这个告警(在stdafx.h中define或在项目属性中设置预处理符号,preprocessor definitions)。 除了c语言的crt函数外,posix 兼容函数也存在这个告警,解决方法是用posix标准名称替换(
16、比如access换成_access)或者是定义 _crt_nonstdc_no_warnings 压制这个告警(方法同上)。四、“cwinapp:enable3dcontrols”引起的c4996告警 这个是编译使用了老的向导生成的mfc代码时遇到的问题,一个典型的告警信息输出如下所示:crpfilecrack.cppf:project.crpfilecrack.cpp(52) : warning c4996: cwinapp:enable3dcontrols: cwinapp:enable3dcontrols is no longer needed. you should remove th
17、is call. e:softwaremicrosoft visual studio 9.0vcatlmfcincludeafxwin.h(4818) : see declaration of cwinapp:enable3dcontrols通常向导生成的代码是:#ifdef _afxdll enable3dcontrols(); / call this when using mfc in a shared dll#else enable3dcontrolsstatic(); / call this when linking to mfc statically#endif这两个函数的调用是旧的
18、mfc版本对新版本的操作系统特性的支持,在新的(那个时候是新的)windows 95平台上要这样调用一下才能使用新的windows 3d样式的控件,否则就是老的win 3.2样子的控件。想当初喜欢owl就是因为感觉它的控件比较“酷”,比如那个带底纹的对话框,菱形的checkbox,还有带图标的“ok”按钮,看到mfc作出来的灰灰的界面就觉得土,不过后来就知道mfc做界面也是很漂亮的,比如我做的。,再打住。对于新的mfc版本来说已经不需要再调用这两个函数了,参考前面的方法,用_msc_ver对其隔离就行了:#if _msc_ver = 1200 / mfc 6.0 or earlier #ifd
19、ef _afxdll enable3dcontrols(); / call this when using mfc in a shared dll #else enable3dcontrolsstatic(); / call this when linking to mfc statically #endif#endif五、.def文件引起的连接告警 对于普通的dll项目中使用的.def文件通常会引起lnk4017链接告警,如下所示:.comfunc.def(4) : warning lnk4017: description statement not supported for the ta
20、rget platform; ignored creating library .debug/comfunc.lib and object .debug/comfunc.exp一个典型的.def文件通常有以下内容:library xorcryptordescriptionxorcryptor windows dynamic link libraryexports ; explicit exports can go here .消除这个连接告警的方法就是从.def文件中删除description描述信息,不过这个告警也不是什么大问题,不删也可以。另一个可能产生的连接告警是lnk4222,通常出现
21、在ocx控件和com组件的项目中,一个典型输出是:linking.plusinmodule.def : warning lnk4222: exported symbol dllcanunloadnow should not be assigned an ordinal.plusinmodule.def : warning lnk4222: exported symbol dllgetclassobject should not be assigned an ordinal.plusinmodule.def : warning lnk4222: exported symbol dllregist
22、erserver should not be assigned an ordinal.plusinmodule.def : warning lnk4222: exported symbol dllunregisterserver should not be assigned an ordinal出现这个告警的原因是旧的项目的.def文件通常这样定义ocx和com必需的四个导出函数:exports dllcanunloadnow 1 private dllgetclassobject 2 private dllregisterserver 3 private dllunregisterserve
23、r 4 private其中为这四个重要的导出函数指定了四个顺序号。windows平台上通常用两种方式定位dll文件中的导出函数,一种是根据导出函数名称,一种是根据顺序号,上学时曾经写过一个显示图片的程序,能处理大多数当时流行的图像格式文件,唯独jpeg格式的搞不定,有一次看到一个图像处理软件中包含了一个loadjpeg.dll,很显然这个dll是处理jpeg格式的图像文件的嘛,于是赶快用depends look了一下,顿时高喊:鬼啊。原来这个depends竟然查不到导出函数的名字,后来才知道还有noname参数强制用顺序号定位导出函数,于是就常常弄个没有导出函数名字的dll到处show。嗯,又
24、扯远了。话说为什么旧的系统要以此指定这四个导出函数的顺序号我就没有研究了,反正现在不需要指定了,只要将1,2之类的删除就行了,不过不删好像也没什么问题,它们会被自动忽略。六、使用mfc的消息映射宏引起的编译错误 错误现象之一:f:project.plusmaindlg.cpp(220) : error c2440: static_cast : cannot convert from void (_thiscall cplusmaindlg:* )(int,bool) to lresult (_thiscall cwnd:* )(wparam,lparam) none of the functi
25、ons with this name in scope match the target type 错误现象之二:f:project.crpfileopavdlg.cpp(87) : error c2440: static_cast : cannot convert from lresult (_thiscall ccrpfileopavdlg:* )(lpctstr,int) to lresult (_thiscall cwnd:* )(wparam,lparam) none of the functions with this name in scope match the target
26、type 以上两个编译错误产生是因为新旧版本的mfc 中对on_message消息映射宏定义不同引起的,先看看老版本的mfc的on_message消息宏定义:#define on_message(message, memberfxn) message, 0, 0, 0, afxsig_lwl, (afx_pmsg)(afx_pmsgw)(lresult (afx_msg_call cwnd:*)(wparam, lparam)&memberfxn ,再看看新版本的on_message定义:#define on_message(message, memberfxn) message, 0, 0,
27、 0, afxsig_lwl, (afx_pmsg)(afx_pmsgw) (static_cast (memberfxn) ,注意,函数类型没有变化,都是:lresult (afx_msg_call cwnd:*)(wparam, lparam);类型的函数指针(cwnd以及派生类的类成员函数指针),区别之处是新的on_message宏使用c+的 static_cast 操作符代替了c类型的强制转换。产生这两个错误其实是因为用户没有按照on_message宏的约定声明和定义消息响应函数造成的,比如,对于某些不需要处理返回值的消息响应函数,用户通常这样声明和定义消息响应函数:在头文件中声明:a
28、fx_msg void onfileprocess(wparam wparam,lparam lparam);在源文件中实现:void ccrpfileopavdlg:onfileprocess(wparam wparam, lparam lparam).或者更过分一些,直接指定为实际参数类型:在头文件中声明:afx_msg void onfileprocess(lpctstr lpszmessage, int npercent);在源文件中实现:void ccrpfileopavdlg:onfileprocess(lpctstr lpszmessage, int npercent).旧版本的
29、on_message使用了c类型的强制转换,宏解开后的代码后不会产生错误信息,但是改成对类型检查很严格的static_cast 操作符时就出问题了,因为通不过static_cast 操作符的检查。解决方法就是修改代码,同时吸取教训,普遍使用的方法并不一定就能约定俗成,一切还是要按照规矩来。 错误现象之三:f:project.wzbutton.cpp(74) : error c2440: static_cast : cannot convert from uint (_thiscall cwzbutton:* )(cpoint) to lresult (_thiscall cwnd:* )(cp
30、oint) cast from base to derived requires dynamic_cast or static_cast 出现这个错误的原因可是“人力不可抗拒”之原因造成的,因为旧版本的 on_wm_nchittest 宏使用了uint (_thiscall cwzbutton:* )(cpoint);类型的类成员函数指针,其定义如下:#define on_wm_nchittest() wm_nchittest, 0, 0, 0, afxsig_wp, (afx_pmsg)(afx_pmsgw)(uint (afx_msg_call cwnd:*)(cpoint)&onnchi
31、ttest ,但是新版本变成了:#define on_wm_nchittest() wm_nchittest, 0, 0, 0, afxsig_l_p, (afx_pmsg)(afx_pmsgw) (static_cast (&thisclass : onnchittest) ,注意返回值类型由uint改成了lresult,再加上static_cast的严格检查,所以就出错了。修改的方法就是将你的onnchittest函数由:afx_msg uint onnchittest(cpoint point);改成:afx_msg lresult onnchittest(cpoint point);不
32、必太在意,这个不是你的错,不过,如果你要维护一个老的界面库(通常很多控件的subclass都会用到on_wm_nchittest),改起来还是很痛苦地,不扯了,继续下一个。七、statreg.cpp 和 atlimpl.cpp 的废弃(obsolete)问题 在编译老的atl向导生成的代码时,会遇到下面的编译输出:stdafx.cppstatreg.cpp is obsolete. please remove it from your project.atlimpl.cpp is obsolete. please remove it from your project.因为老的atl向导生成的
33、代码通常在stdafx.cpp文件中添加以下代码:#ifdef _atl_static_registry#include #include #endif#include 根据提示删除#include 和#include 两行代码就行了,不过更好的办法是这样改:#ifdef _atl_static_registry#include #if _msc_ver = 1200 / mfc 6.0 or earlier#include #endif#endif#if _msc_ver = 1200 / mfc 6.0 or earlier#include #endif八、新的c+编译器不再支持默认类型的
34、变量定义错误现象是:f:project.wzcheckbox.cpp(464) : error c4430: missing type specifier - int assumed. note: c+ does not support default-int产生这个错误的原因是程序中出现了这样的代码:const some_const_var = 10;或static some_static_bool = false;新的c+编译器严格按照c+标准,不再支持默认类型的变量定义方式,必须严格指定变量类型,如下使用:const int some_const_var = 10;或static boo
35、l some_static_bool = false;九、for 语句的变量作用域问题 考察下面的代码:for(int i = 0; i 120; i+) if(something_happen) break; .if(i 120) /something happen在vc6的编译器中,这样的代码是没有问题的,因为vc6的编译器为了兼容旧的microsoft c/c+编译器,没有严格按照c+标准执行,但是从vc7开始,vc的编译器开始遵守c+标准,所以就会出现“变量i没有定义的错误”。解决的方法也很简单,按照jim hyslop 和 herb sutter的经典对话系列的第四篇中的方法,改成如
36、下就可以了:int i;for(i = 0; i 120; i+)十、字符串函数的返回值问题 strchr(_tcschr)、strpbrk(_tcspbrk ?)、strrchr(_tcsrchr)和strstr(_tcsstr)这四个函数在vc6的crt库中定义的返回值都是char *(tchar *),所以以前的代码通常是这样使用的:tchar *cp = _tcschr( pszpath, _t() );/使用*cp,可以通过cp指针修改pszpath的内容这其实是一个“漏洞”,因为如果pszpath是const char(tchar) *字符串,那么就表示它不希望修改字符串的内容,但
37、是调用strchr(_tcschr)函数后就可以通过cp指针修改其内容了,这岂不荒谬?所有在新版本的crt库中,这几个函数的返回值都改成const char *,这就会导致上面的代码产生编译错误。建议的修改方式是改成如下方式:const tchar *cp = _tcschr( pszpath, _t() );/不能再通过cp指针修改pszpath的内容但是这样修改可能对代码的影响比较大,比如下面的代码:tchar buf256; /局部缓冲区.tchar *cp = _tcschr( buf, _t() );/作为局部缓冲区(非const),希望通过cp修改buf的内容这种情况怎么办呢?对了
38、,c+还有个const_cast操作符,这时就可以排上用场了:tchar *cp = const_char(_tcschr( buf, _t() );不过上面的方法要慎用,除非确定buf是非const的,否则最好老老实实地修改代码。十一、类成员函数指针做为函数参数的“c3867”错误 考察下面的代码,cwzwindowshook类的构造函数使用一个该类的成员函数指针,这样构造对象时可以选择消息过滤的handler,可以是mousemsgfilter,也可以是keyboardmsgfilter:typedefbool (cwzwindowshook:*filterproc)(wparam wparam, lparam lparam);/ a hook used in customization sheet to filter keyboard/mouse eventsclass cwzwi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 丽水市2025年浙江缙云县自然资源勘测中心公开招聘编外工作人员3人笔试历年参考题库典型考点附带答案详解
- 中山市2025广东中山市纪委监委所属事业单位招聘事业单位人员2人笔试历年参考题库典型考点附带答案详解
- 东营市2025年山东东营市河口区机关事业单位招聘后勤管理人员(2人)笔试历年参考题库典型考点附带答案详解
- 东莞市2025广东东莞市松山湖管委会总工室专业人才招聘3人笔试历年参考题库典型考点附带答案详解
- 东莞市2025上半年广东东莞市望牛墩镇招聘镇政府材料员(特色人才聘员)1人笔试历年参考题库典型考点附带答案详解
- 东区2025四川攀枝花市东区服务基层项目人员考核招聘为乡镇事业单位工作人员1人笔试历年参考题库典型考点附带答案详解
- 上海市2025上海市第五社会福利院招聘5人(二)笔试历年参考题库典型考点附带答案详解
- 三明市2025福建三明医学科技职业学院招聘编外工作人员13人笔试历年参考题库典型考点附带答案详解
- 2025中国排球协会北京华力宝广告有限公司招聘4人笔试历年难易错考点试卷带答案解析
- 三门峡市体育运动学校招聘真题
- 2025年空调维修公司岗前安全生产试题及答案
- 精神科叙事护理案例分享
- 2025版幼儿园章程幼儿园办园章程
- 基于STM32单片机的智能宠物项圈
- 汽车检测站安全操作规程
- 2025年事业单位招聘考试职业能力倾向测验试卷(造价工程师类)
- 医院保洁毛巾分区分色管理
- 12S522混凝土模块式排水检查井图集
- 民航安全培训课件
- 二级短元音(课件)牛津英语自然拼读
- 控制方案变更管理制度
评论
0/150
提交评论