新接手的项目在DEBUG时,在利用Istream生成Image对象出错,如果打开项目什么都不做又会报GdiplusShutdown(m_pGdiToken);中断的错误。所以现在找到的断点位置都是库函数内部,但是在其他项目里也是调用相同方法,没有问题。
bool image::load(char *szfile)
{
bool bret = false;
LPBYTE lp = NULL;
int size = basic::get_file(szfile, (PBYTE *)&lp);
if (size != 0 && lp != NULL)
{
bret = load(lp, size);
basic::get_file_free((PBYTE *)&lp);
m_hbitmap = (HBITMAP)LoadImage(NULL, szfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
}
return bret;
}
bool image::load(LPBYTE lp, DWORD dw)
{
bool bret = false;
void *pbuffer = NULL;
if (lp == NULL || dw == 0)
return bret;
release();
copy(lp, dw);
m_hbuffer = ::GlobalAlloc(GMEM_FIXED, dw);
if (NULL == m_hbuffer)
goto end;
pbuffer = ::GlobalLock(m_hbuffer);
if (pbuffer)
{
CopyMemory(pbuffer, m_lp, m_size);
if (::CreateStreamOnHGlobal(m_hbuffer, FALSE, &m_pstream) == S_OK)
{
//-----------------此处触发中断,点击继续后正常运行,下次运行到这里不会触发中断--------//
m_image = Bitmap::FromStream(m_pstream);
//-------------------------------------------------------------------------------------------------------------------//
//m_pstream->Release();
if (m_image)
bret = true;
}
::GlobalUnlock(m_hbuffer);
}
//::GlobalFree(m_hbuffer);
end:
return bret;
}
当程序运行后什么都不做直接退出,会在GdiplusShutdown(m_pGdiToken);出报错。
以上断点都是在debug调试状态下触发,直接运行exe没有问题,分析可能是指针越界或者使用空指针,可是断点都在相应的库函数里,GDI+库里。