乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 32|回复: 1

BlockIconToBMP在x64的怪事

[复制链接]

62

主题

218

帖子

10

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
466
发表于 2017-10-22 09:28:00 | 显示全部楼层 |阅读模式
这是张帆老师的块图标预览中函数
HBITMAP CpreviewBlkDlg::BlockIconToBMP(const AcDbObjectId &blkId, HDC hdc)
{
        Acad::ErrorStatus es;
        AcDbBlockTableRecord *pBlkTblRcd = NULL; // 块表记录的指针
        AcArray icon;    // 保存预览图标的数组
        // 获得保存块表记录的预览图标的数组
        try
        {
                es = acdbOpenObject(pBlkTblRcd, blkId, AcDb::kForRead);
                if (es != Acad::eOk)
                        throw 1;
                if (!pBlkTblRcd->hasPreviewIcon()) // 如果块定义不包含预览图标
                {
                        pBlkTblRcd->close();
                        return NULL;
                }
                es = pBlkTblRcd->getPreviewIcon(icon);
                if (es != Acad::eOk)
                        throw 2;
                es = pBlkTblRcd->close();
                if (es != Acad::eOk)
                        throw 3;
        }
        catch (...)
        {
                pBlkTblRcd->close();
                return NULL;
        }
        // 由icon数组获得可显示的位图
        BITMAPINFOHEADER ih;
        // 位图信息头
        memcpy(&ih, icon.asArrayPtr(), sizeof(ih));
        size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD));
        LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize);
        // 位图信息
        memcpy(bi, icon.asArrayPtr(), memsize);
        HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT, icon.asArrayPtr() + memsize, bi, DIB_RGB_COLORS);
        free(bi);
        return hbm;
}   
其中这一句size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))在x64上编译会出现警告提示隐式转换成64位,在运行中不会出错;如果改成size_t memsize = sizeof(BITMAPINFOHEADER) + ((1i64<<ih.biBitCount) * sizeof(RGBQUAD))编译时没有警告,但是在运行时会引起CAD崩溃。在图标位图为32bit时即ih.biBitCount=32时,sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))=44,而sizeof(BITMAPINFOHEADER) + ((1i64<<ih.biBitCount) * sizeof(RGBQUAD))=40。当memsize=40时,运行到HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT, icon.asArrayPtr() + memsize, bi, DIB_RGB_COLORS)就引起CAD崩溃了。有哪位老师解释一下,并告诉这个代码如何改进。
回复

使用道具 举报

56

主题

309

帖子

15

银币

中流砥柱

Rank: 25

铜币
530
发表于 2017-10-22 10:16:00 | 显示全部楼层
size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))没问题,为什么要改?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 12:56 , Processed in 0.145059 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表