关于MFC项目中,使用GDI+加载图片时内存报错的问题

现在接手的一个项目中,利用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的长度是否有溢出?