vc6项目-vc8项目 转换日志
此随笔参考了http://blog.163.com/feng_qihang/blog/static/7129199120093422722430/
把VC6的项目转换成VS2005项目,经过VS2005的自动转换后,进行编译,遇到了很多问题,记录如下。
1. 变量声明。
由于编译器对C++标准支持的差异,在 for 之类的语句里的变量的声明容易引起编译错误,比较常见。
2.MFC消息函数返回值。
有些消息函数应该把返回值类型从void或者UINT改成LRESULT,把参数类型从UNIT或者LONG改成WPARAM、LPARAM。例如:
//VC6 afx_msg virtual void OnGraphModified(UINT wParam, LONG lParam); //VC8 afx_msg virtual LRESULT OnGraphModified(WPARAM wParam, LPARAM lParam);
3. 类型转换问题。
1) 类型检查在vc8里更严格。所以很多类型不符方面的警告,需要强制转换。即使int和unsigned int的比较都会是个警告。
2) 有些库函数,在VC6和VC8中,返回类型不一致。例如:_tcschr,在VC6和VC8中的定义分别为:
//VC6 __inline char * _tcschr(const char * _s1,unsigned int _c) //VC8 _CRTIMP __checkReturn _CONST_RETURN char * __cdecl strchr(__in_z const char * _Str, __in int _Val);
所以,会出现如下修改:
//VC6 LPTSTR p =_tcschr(s, _T(',')); //VC8 LPTSTR p = (LPTSTR)_tcschr(s, _T(','));
4. 引用DLL 问题。
如果工程中引用了第三方的库,那么第三方库也需要在VS2005下编译,然后再一起链接、使用。
5. DialogBar初始化。
在VC6中,CDialogBar::HandleInitDialog方法在成功时返回TRUE,在失败时返回FALSE。而在VC8中,该方法始终返回FALSE。所以,如果在VC6程序中,有判断CDialogBar::HandleInitDialog方法返回值的代码,升级到VS2005时需要注释掉。
在VC6、VC8中,方法的源码如下:
//VC6 LRESULT CDialogBar::HandleInitDialog(WPARAM, LPARAM) { Default(); // allow default to initialize first (common dialogs/etc) // create OLE controls COccManager* pOccManager = afxOccManager; if ((pOccManager != NULL) && (m_pOccDialogInfo != NULL)) { if (!pOccManager->CreateDlgControls(this, m_lpszTemplateName, m_pOccDialogInfo)) { TRACE0("Warning: CreateDlgControls failed during dialog bar init.\n"); return FALSE; } } return TRUE; } //VC8 LRESULT CDialogBar::HandleInitDialog(WPARAM, LPARAM) { Default(); // allow default to initialize first (common dialogs/etc) // create OLE controls COccManager* pOccManager = afxOccManager; if ((pOccManager != NULL) && (m_pOccDialogInfo != NULL)) { if (!pOccManager->CreateDlgControls(this, m_lpszTemplateName, m_pOccDialogInfo)) { TRACE(traceAppMsg, 0, "Warning: CreateDlgControls failed during dialog bar init.\n"); return FALSE; } } return FALSE;//-----区别在这里 }
下面的问题是http://blog.163.com/feng_qihang/blog/static/7129199120093422722430/中提到,而我没有遇到的问题,记录下来,方便以后用。
6. 函数返回值。
VC8对函数返回值检查比较严格。比如,函数定义为返回某个类的引用,那么返回NULL在VC6中是可以编译通过,但在VC8中不行。
这应该是类型检查更严格的问题。
7. 标准函数被编译出警告 “被声明为否决”。
解决方法:根据编译器输出提示,到声明该函数的h文件中,找到该函数对应的名称,修改成新名称即可。例如,hypot,需要修改成_hypot。
8. BSCMAKE :1506
网上可以搜索到解决方法。修改:工程属性-》配置属性-》c/c++-》浏览信息 启用浏览消息 无
9. fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
工程设置的问题。工程属性-》配置属性-》c/c++-》代码生存-》运行时库 改成MD 方式。