内存泄漏··实在找不到问题所在··求助下论坛
猫儿累了 2012-04-07 02:42:07 HBITMAP Copybitmap(LPRECT lprect)
{
HDC hscrdc,hmemdc;
HBITMAP hbitmap, holdbitmap;
int nx,ny,nx2,ny2;
int nwidth,nheight;
int xscrn,yscrn;
if(IsRectEmpty(lprect))
return NULL;
hscrdc=CreateDC(L"display",NULL,NULL,NULL);
hmemdc=CreateCompatibleDC(hscrdc);
nx=lprect->left;
ny=lprect->top;
nx2=lprect->right;
ny2=lprect->bottom;
xscrn = GetDeviceCaps(hscrdc, HORZRES);
yscrn = GetDeviceCaps(hscrdc, VERTRES);
if (nx < 0)
nx = 0;
if (ny < 0)
ny = 0;
if (nx2 > xscrn)
nx2 = xscrn;
if (ny2 > yscrn)
ny2 = yscrn;
nwidth = nx2 - nx;
nheight = ny2 - ny;
hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);
holdbitmap = (HBITMAP)SelectObject(hmemdc, hbitmap);
BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny, SRCCOPY);
hbitmap = (HBITMAP)SelectObject(hmemdc, holdbitmap);
//清除
DeleteDC(hscrdc);
DeleteDC(hmemdc);
// 返回位图句柄
return hbitmap;
}
void CJPG研究Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
using namespace Gdiplus;
/////////////////////截图并返回图像句柄///////////////////////////
LPRECT temprect;
temprect=new RECT();//使用NEW创建一个RECT对象于动态内存区中,并返回对象首地址赋给temprect变量
temprect->bottom=768;//第二点Y
temprect->left=0;//第一点X
temprect->right=1366;//第二点X
temprect->top=0;//第一点Y
Sleep(3000);
HBITMAP bm=Copybitmap(temprect);
delete temprect;
Bitmap* pBmp = Bitmap::FromHBITMAP(bm, NULL); // 从我得到的截图的句柄创建一个Bitmap,指针pBmp
DeleteObject(bm);//释放位图句柄
IStream* pStream = NULL;
CreateStreamOnHGlobal(NULL, TRUE, &pStream);
CLSID jpgClsid;
GetEncoderClsid(L"image/jpeg", &jpgClsid);
pBmp->Save(pStream, &jpgClsid);
HGLOBAL hGlobal = NULL;
GetHGlobalFromStream(pStream, &hGlobal);
DWORD daxiao=GlobalSize(hGlobal);
LPBYTE pBits = (LPBYTE)GlobalLock(hGlobal);
GlobalUnlock(hGlobal);
pStream->Release();
delete pBmp;
}
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num,&size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:编码方式的具体描述
if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0 )
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
以上是一段MFC捉屏的代码,当不断点击按钮一运行OnBnClickedButton1函数···发现内存不停的升高···有时候内存又停止不动···测试过后发觉··当截图的时候与上一张图片(也就是电脑屏幕画面变化不大的时候)···内存没升高··但是当截图的画面变化了··那么我们再点按钮一的时候···内存就升高了···貌似是内存泄漏···但是代码里我又明明用了pStream->Release();其释放流对象和内存···有点怀疑是这个流的问题···大家可以复制代码去测试一下··答得好的加分啊喂····找了好久木有找出原因··在线等答案··