明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1347|回复: 3

BlockIconToBMP在x64的怪事

[复制链接]
发表于 2017-10-22 09:28:18 | 显示全部楼层 |阅读模式
这是张帆老师的块图标预览中函数
HBITMAP CpreviewBlkDlg::BlockIconToBMP(const AcDbObjectId &blkId, HDC hdc)
{
        Acad::ErrorStatus es;
        AcDbBlockTableRecord *pBlkTblRcd = NULL; // 块表记录的指针
        AcArray<Adesk::UInt8> 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崩溃了。有哪位老师解释一下,并告诉这个代码如何改进。

发表于 2017-10-22 10:16:23 来自手机 | 显示全部楼层
size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))没问题,为什么要改?
发表于 2022-9-3 22:41:44 | 显示全部楼层
哥们儿,我跟你一样有这个问题,我没有解决好,这段代码我在arx2007版本编译通过了,但在arx2018上没有搞定:Q
发表于 2022-9-3 22:44:25 | 显示全部楼层
问题是在这个位置,1<<ih.biBitCount .... 32位跟64位的移位不一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:48 , Processed in 0.158862 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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