BlockIconToBMP在x64的怪事
这是张帆老师的块图标预览中函数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崩溃了。有哪位老师解释一下,并告诉这个代码如何改进。
size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD))没问题,为什么要改? 哥们儿,我跟你一样有这个问题,我没有解决好,这段代码我在arx2007版本编译通过了,但在arx2018上没有搞定:Q 问题是在这个位置,1<<ih.biBitCount .... 32位跟64位的移位不一样
页:
[1]