VS2013打开VC++6.0开发工程遇到的问题及解决
由于版本更新,之前的软件是在Visual C++ 6.0环境下开发的,目前要在Visual Studio 2013的环境下进行升级。用VS2013直接打开项目工程文件,编译运行会出现错误,主要是以下几个问题:
- error MSB8031 多字节字符集与Unicode字符集的冲突
- error C2440
- error LNK2005
error MSB8031 多字节字符集与Unicode字符集的冲突
Visual C++ 6.0默认使用多字节字符集,开发的工程代码中很多字符串与Visual Studio 2013默认使用的Unicode字符集的字符串格式不统一,用高版本的编译器打开低版本的工程文件会出现很多不兼容的错误。此时,并不需要一一修改源代码中所有的出错字符串,微软官方已经给出了解决办法。只需要在官网下载安装与高版本编译器相一致的微软基础类库的多字节字符集即可。链接地址如下:
微软基础类库的下载地址
error C2440
error C2440: “static_cast”: 无法从“UINT (__thiscall CSizingControlBar:😗 )(CPoint)”转换为“LRESULT (__thiscall CWnd:😗 )(CPoint)” f:\tools\4bands ifx_xmm2130_ft\common\sizecbar.cpp 109
CWnd类,afx_msg LRESULT OnNcHitTest(CPoint point);
而在CSizingControlBar中是afx_msg UINT OnNcHitTest(CPoint point);
只要将这些UINT替换为LRESULT就可以了。
查找OnNcHitTest,将下面两行:
afx_msg UINT OnNcHitTest(CPoint point);//.h
UINT CTestDlg::OnNcHitTest(CPoint point);//.cpp
改为:
afx_msg LRESULT OnNcHitTest(CPoint point);//.h
LRESULT CTestDlg::OnNcHitTest(CPoint point);//.cpp
error LNK2005
uafxcwd.lib(afxglobals.obj) error LNK2005: “public: virtual __thiscall CMemDC::~CMemDC(void)” (??1CMemDC@@UAE@XZ) already defined in MultiColorPlotCtrl.obj
上面是意思是,连接器说,我找到了两个定义,一个在 uafxcwd.lib(afxglobals.obj)里面,还有一个在MultiColorPlotCtrl.obj 。
工程中有一个MemDC.h文件,里面定义了一个CMemDC类,不巧的是,VS2010的MFC新增了这个类,所以链接时会出问题。
那怎么解决了?有如下办法:
1 修改MFC中CMemDC的名字。这个明显不行。。。
2 将emule中的CMemDC改个名字,这个方法可以,可是我找了下,貌似用这个类的文件还不少。不甘心一条条改,于是想出下面的方法。。。
3 增加一个宏定义,
#define CMemDC XCMemDC
将上面的语句加到stdafx.h的最后。(也可以在工程属性页中以编译器指令的形式定义宏,格式为 /D “CMemDC=XCMemDC”)。