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.
");
           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.
");
           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 方式。

原文地址:https://www.cnblogs.com/xiaoyusmile/p/3919447.html