VS 是 Visual Studio,它是微软提供的一个工具集,由各种各样的工具组成。VS 可以支持 C/C++、VB、JAVA、C# 编程。然了一次只能支持一种编程方式。在 VS 安装完成,第一次运行的时候会让你选择常用语言,如果你选择 C/C++,那么他就成了能够进行 C/C++ 编程的平台也许就是你所说的 VC 了。如果不想用 C/C++ 的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。
VC 是 Visual C++,是一个独立的 C/C++ 的开发工具,比较著名的是 VC6.0,现在的 VC2010其实就是 VC10.0。
再通俗一点,以 VS2010 和 VC2010 为例,VS2010 相当与 Office2010,包括了 World2010、Excel2010 等,而 VC2010 就相当于是 World2010。
尽管vc和vs同出于一家,但是迁移起来最大的问题确实VC++6.0的版本太过古老,VC++6.0发布于1998年,都不支持C99语法,在C++的一些语法上,还有一些通信机制上都会跟VS2019产生不兼容的情况,这时候就需要对此进行修改和迁移了,以下是我对于迁移的过程和对于遇见的bug的修改。
因为是MFC项目,牵扯到界面,所以VS上必须有MFC的插件,这个可以到Visual Studio Install上找到,下载即可。
打开vs,找到vc项目打开.dsw的vc专有项目名,会自动生成一个.sln的vc项目,以后就可以打开.sln来打开项目。这时候,VS会识别出这个古老项目,然后vs会自动进行迁移,并生成迁移报告。
直接运行项目看看会出现什么错误
是编译的配置问题,需要对项目属性进行一下配置:
进入“项目”—>“属性”—>“C/C++”
(1)—>“常规”—>“调试信息格式”—>选择“程序数据库(/Zi)”或“无”
或者
(2)—>“代码生成”—>“启用函数集链接”—>选择“是 (/Gy)”
坏消息:大概有500多个error!!
好消息:error大概可以分为几种
我在这将修改方法的危险等级分成成5个级别:
极低:几乎不会对源程序造成任何影响;
低: 可能会对程序造成较小影响,也可能没有影响;
中: 可能对程序造成不确定的影响,影响可能大可能小;
高: 确定会对程序造成影响,但不会导致程序崩溃;
极高:会对程序的造成影响,可能导致程序崩溃;或者注释错误语句跳过错误位置,属于没办法的修改bug方式。
原因:这个error的主要原因是vc和vs的编译器语法的差别,vs更加严格,vc里变量声明在整个函数里有效,但vs声明在for循环就只在for循环有效。
修改方法:找到error位置,未声明的进行声明
危险等级:极低
结果:错误少了300个
Error类型2: 有多个运算符“+=”与这些操作符匹配
原因: 0x01,0x00这样是定义了一个字节的数据,也就是八位数据,相当于一个char或者unsigned char,这两种类型强制类型转换并不会造成数据的更改,是安全的数据类型转换。
修改方法:去掉(char)或者改为(unsigned char)
危险等级: 低
结果: error又少了100多个
Error类型3: C2039 “basic_string”: 不是 “std” 的成员
原因: 头文件问题
修改方法:
增加头文件:
#include
危险等级: 极低
结果: 少了10来个error
Error类型4: C2440 “初始化”: 无法从“unsigned char”转换为“ATL::CStringT
原因: unsigned char无法转化为CString,但char可以
修改方法:用char强制类型转换然后赋值
危险等级:中(添加注释//wch error-4方便后续回退修改)
结果: error减少两个
Error类型5: C2440 “初始化”: 无法从“unsigned short *”转换为“std::basic_string
原因: unsigned short 数组没法转化为string类型,原先程序是想把CString类型转换为string类型,先将CString转化成unsigned short数组
修改方法:参考博客
https://www.it610.com/article/4240313.htm,http://blog.sina.com.cn/s/blog_530e99a40101127z.html,更换转化方式
CString str = "456那你";
CT2A xx(str);
std::string Str = xx.m_psz;
std::cout << Str;
危险等级:中(中文显示是可以的,但不确定会不会有其他的显示问题)
结果:减少7个error
Error类型6: 无法从“int”转换为
“std::_List_iterator
原因: std::list::iterator ilist = NULL;
链表list在vs不再支持初始化为NULL,NULL是一个固定的int值(0),相当于给list赋值int值无法强制类型转化
修改方法:可以使用初始化时指向list.end(),表示指向一个list的末端相当于空。
危险等级: 极低
结果:error减少3个
Error类型7: static_cast”: 无法从“void (__thiscall CADPHeader: )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd: )(WPARAM,LPARAM)”
原因:
修改方法:https://blog.csdn.net/hqyhqyhq/article/details/8291547,
危险等级:低
结果:少了30多个error,胜利在望
Error类型8:“static_cast”: 无法从“void (__thiscall CEditListCtrl: )(UINT,UINT,CScrollBar )”转换为“void (__thiscall CCmdTarget:: )(NMHDR *,LRESULT *)”
原因: ON_NOTIFY_REFLECT映射消息的传入函数的变量与自定义函数的变量类型和数量不匹配问题
修改方法:暂且注释掉这两行函数,之后可以寻找其他的方法代替
危险等级: 高(没有绑定编辑栏滑块滑动消息,可能有调用而没有操作)
结果:剩余几个error全部消失
Error类型9: LNK1281 无法生成 SAFESEH 映像。
原因: 编译器问题
修改方法:https://blog.csdn.net/moonlightpeng/article/details/80821729
1.打开该项目的“属性页”对话框。
2.单击“链接器”。
3.单击“命令行”。
4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。
危险等级: 极低
结果:页面启动,更加高清页面的软件get!!
Error类型10: 启动多线程时出现程序崩溃的情况,0x00833257 处有未经处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突
原因:vs不支持通过AfxGetMainWnd()获取窗口句柄
修改方法:把AfxGetMainWnd()->m_hWnd改成AfxGetApp()->m_pMainWnd->m_hWnd即可
https://blog.csdn.net/u011327981/article/details/45170445
危险等级: 极低
经过一系列的debug操作,程序终于是跑起来了,但是具体功能是否正常还需进一步的测试和debug,迁移也不可能说是百分百保留原来的,也是会包含一定风险的,毕竟VC++6.0实在是太久远了。。