开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1431|回复: 0
收起左侧

[图文教程] VC6代码移植到高版本VC时候的常见问题

[复制链接]
结帖率:100% (2/2)
发表于 2013-9-12 21:05:16 | 显示全部楼层 |阅读模式   广东省湛江市

最近把一个VC6工程移植到高版本VC时候,总结的一些代码需要修改的地方:


1、循环体变量的作用域的差异

VC6可以这样写,循环变量在循环体外面一样有效:
for(int i=0; i<m_aPlugIns.GetSize(); i++)
{
    ...
}
...
for(i=0; i<m_aPlugIns.GetSize(); i++)
{
    ...
}

高版本VC则限定了循环体变量的作用域,需要改成下面这样:
for(int i=0; i<m_aPlugIns.GetSize(); i++)
{
    ...
}
...
for(int i=0; i<m_aPlugIns.GetSize(); i++)
{
    ...
}

2、变量定义时候的默认类型

VC6中如果一个变量未定义类型,则按照默认类型(int类型)来处理,不会报错,例如下面这行代码在VC6中默认是可以编译的
static g_bSplashTimer = FALSE;

高版本VC则必须要定义变量类型,所以上面的代码编译时候会报错,需要修改为:
static BOOL g_bSplashTimer = FALSE;

函数返回值定义同样存在这样的问题。

3、类型转换问题

class CToolStatusPane : public CObject
{
public:
    CToolStatusPane();
    ~CToolStatusPane();
    CToolStatusPane(const CToolStatusPane& other)
    {
        m_nID            = other.m_nID;
        m_nWidth        = other.m_nWidth;
        m_strText        = other.m_strText;
        m_strTooltip    = other.m_strTooltip;
        m_strIcon        = other.m_strIcon;
        m_strAction        = other.m_strAction;
    }
    CToolStatusPane& operator = (const CToolStatusPane& other)
    {
        m_nID            = other.m_nID;
        m_nWidth        = other.m_nWidth;
        m_strText        = other.m_strText;
        m_strTooltip    = other.m_strTooltip;
        m_strIcon        = other.m_strIcon;
        m_strAction        = other.m_strAction;
        return *this;
    }
public:
    UINT    m_nID;                // Pane ID
    int        m_nWidth;            // Pane宽度
    CString    m_strText;            // Pane文字
    CString    m_strTooltip;        // Pane提示信息
    CString    m_strIcon;            // Pane图标
    CString    m_strAction;        // 动作
};
typedef CArray<CToolStatusPane, CToolStatusPane&> CToolStatusPaneArray;

for(int i=0; i<other.m_arStatusPane.GetSize(); i++)
{
     m_arStatusPane.Add(other.m_arStatusPane);
}

上面这段代码在VC6可以编译,高版本VC编译时候会报下面的错误:
error C2664: “CArray<TYPE,ARG_TYPE>::Add”: 不能将参数1 从“const CToolStatusPane”转换为“CToolStatusPane &”
        with
        [
            TYPE=CToolStatusPane,
            ARG_TYPE=CToolStatusPane &
        ]
        转换丢失限定符

改成如下代码可以编译通过:
for(int i=0; i<other.m_arStatusPane.GetSize(); i++)
{
     m_arStatusPane.Add((CToolStatusPane &)other.m_arStatusPane);
}

应该是因为高版本VC对于类型检查更严格造成的。

4、CString的变化

一个从CString派生的类,在VC6可以编译,高版本VC编译出错,代码如下:

class CReportData : public CString
{
public:
    CReportData();
    ~CReportData();

    BOOL New(INT iSubItems);

    BOOL GetSubItem(INT iSubItem, LPINT lpiImage, LPINT lpiOverlay, LPINT lpiCheck, LPINT lpiColor, LPTSTR lpszText, LPINT lpiTextMax);
    BOOL SetSubItem(INT iSubItem, INT iImage, INT iOverlay, INT iCheck, INT iColor, LPCTSTR lpszText);

    BOOL InsertSubItem(INT iSubItem, INT iImage, INT iOverlay, INT iCheck, INT iColor, LPCTSTR lpszText);
    BOOL DeleteSubItem(INT iSubItem);
};

BOOL CReportData::GetSubItem(INT iSubItem, LPINT lpiImage, LPINT lpiOverlay, LPINT lpiCheck, LPINT lpiColor, LPTSTR lpszText, LPINT lpiTextMax)
{
    ...
    LPCTSTR lpsz = m_pchData;
    ...
}

在高版本VC中编译时候会报变量m_pchData找不到,原因是m_pchData在VC6的MFC版本中CString类是有这个成员变量的,高版本的已经没有了,替代方法是改成下面这样:
LPCTSTR lpsz = (LPTSTR)GetString();


您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表