现在接手的一个项目中,利用Istream生成Image对象出错。
相关代码如下:
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;
}
同样的方法在其他项目也在使用,并没有出现中断现象,请大神帮忙看看。
bool id_readr::id_read(PID pid)
{
int iret;
string str;
//unsigned char pucSN;
//unsigned char pucIIN;
unsigned char pucSN[8];
unsigned char pucIIN[4];
IDCardData idcarddata;
if (m_port > 1000)
{
//iret = Syn_StartFindIDCard(m_port, &pucIIN, 0);
iret = Syn_StartFindIDCard(m_port, &pucIIN[0], 0);
Sleep(200);
//iret = Syn_SelectIDCard(m_port, &pucSN, 0);
iret = Syn_SelectIDCard(m_port, &pucSN[0], 0);
Sleep(200);
iret = Syn_ReadMsg(m_port, 0, &idcarddata);
if (iret == 0)
{
strcpy(pid->id, idcarddata.IDCardNo); //身份证号
strcpy(pid->name, idcarddata.Name); //姓名
str = pid->name;
code::trim_string(str);
strcpy(pid->name, str.c_str());
strcpy(pid->sex, idcarddata.Sex); //性别
strcpy(pid->clusters, idcarddata.Nation); //民族
strcpy(pid->birthday, idcarddata.Born); //出生日期
strcpy(pid->address, idcarddata.Address); //地址
strcpy(pid->issuing, idcarddata.GrantDept); //发证机关
strcpy(pid->validity_b, idcarddata.UserLifeBegin); //有效期起
strcpy(pid->validity_e, idcarddata.UserLifeEnd); //有效期止
//----------------------------此处调用image::load方法就是它引起的报错------------------//
pid->photo[0].load(idcarddata.PhotoFileName); //身份证照片
//----------------------------------------------------------------------------------//
return true;
}
}
return false;
}
此处是调用图片加载的的地方。
虽然断点查到是这里,但是我不确定其它地方内存泄漏影响的,请大神帮忙看看,感谢!
PS:
我发现GDI+只要报过一次错,点击继续后,再就不会报错了,终止调试再重启程序后,还会报错。而且如果不调用GDI+的方法,当程序退出时还会报GDI+相关错误。如果使用了GDI+方法退出时就不会报错中断,可是别的项目也用了相同的方法,两个项目很类似,没对比出不同,如果有需要可以提供源码。
退出时中断如下:
还请各位大神帮忙,如果帮忙解决问题,一定追加积分!
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。
用SHCreateMemStream+Bitmap::FromStream
至于堆损坏可以用Application Verifier查一下。
大概率strcpy的问题。 注意那么多个strcpy,每个copy的长度是否有溢出?