zoukankan      html  css  js  c++  java
  • 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 方式。

  • 相关阅读:
    js 常用方法
    Request.UrlReferrer
    批处理定时打开一个网页
    js基础知识总结:函数
    .NET DataTable转换为JSON格式的字符串
    .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
    .NET错误提示之:无法更新EntitySet“TableName”因为它有一个DefiningQuery
    python中安装web.py
    pycharm中运行flask项目安装flask
    jmeter--查看结果数中响应数据部分乱码
  • 原文地址:https://www.cnblogs.com/xiaoyusmile/p/3919447.html
Copyright © 2011-2022 走看看