VC6转VS

主要是在字符里都要加_T("")这个宏,VC6里不用,另外就是对话框的InitDiolag函数在重写里面,当年找这个找了半天,vs2010比vc6好一点,就是特慢!编译时特慢!
我觉得最麻烦的就是UNICODE 和ANSII格式问题
vc默认的是8 vs是16

至于很多字串,你可以在vs 里改成多字节别用unicode就可以了,就可以省去要加_T的麻烦了
第一个问题我没遇到过,但是估计你把原来的afx_msg BOOL OnDestroy()的声明改成afx_msg void OnDestroy()就可以了

第二个问题最好的解决办法是把所有的字符串都加上TEXT标示,如MessageBox("Hello")改为MessageBox(TEXT("Hello"))

把所有的char或CHAR类型全部用TCHAR替换,就可以了.还可以在属性里把使用Unicode字符集改称使用多字节字符集不用修改也可以达到同样效果.不过程序运行速度要比第一种方法稍慢.


重新用vs2008建新工程 再把代码拷贝过来吧 直接打开的话 会有问题的


今天把自己在VC6.0下的代码移植到VC2008,发现了几个比较棘手但是对新手来说很常见的问题。下面是我在网上找的解决方法。以后遇到问题随时更新。

NO.1

mt.exe : general error c101008a: Failed to save the updated manifest to the file2009-10-09 23:15

这个问题经常出现!其实并不是你的真正出现了什么问题,只是你的编译链接的时候编译器自身的问题而已!也许是VS2005 ,VS2008 的BUG吧,解决的方法:点class view中的工程,选右鍵,再点clean就可以了; 或者是 build->clean solusion也可以。

NO.2

error C2664: cannot convert parameter 1 from 'const char [27]' to 'LPCT2009年04月11日 星期六 10:461> error C2664: 'sprintf' : cannot convert parameter 1 from 'const char [27]' to 'LPCTSTR'

1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


error C2664: “sprintf”: 不能将参数 2 从“const char”转换为“LPCWSTR”与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

问题的原因是字符串ANSI和Unicode编码的区别: VC6与VS2003等默认使用ANSI编码,而VS2008默认采用Unicode。简单的说,ANSI用1个字节表示字符,Unicode用2个字节表示1个字符。

在VS2008中,设置如下:

1、alt+F7,进入工程属性设置菜单。

2、在左边下拉菜单中,选择configuration properties --> General --> 在左边project default 中character set中设置 not set。

3、 错误消失



1.MessageBox()
VC++6.0:MessageBox("Hello,World!");
VS2008:MessageBox(L"Hello,World!"); 或 MessageBox(TEXT("Hello,World!"));


https://www.360docs.net/doc/f63616834.html,bo 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 files\microsoft visual studio 8\vc\include\math.h(575): 可能是“long double pow(long double,int)”
d:\program files\microsoft visual studio 8\vc\include\math.h(527): 或“float pow(float,int)”
d:\program files\microsoft visual studio 8\vc\include\math.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必须重新定义



相关主题
相关文档
最新文档