这段截屏代码有内存泄漏有关问题么
这段截屏代码有内存泄漏问题么?
CopyScreenToBitmap(LPRECT 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(_TEXT( "DISPLAY "), NULL, NULL, NULL);
if (hScrDC==0) MessageBox(_T( "CreateDC Fail "),NULL,MB_OK);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
if (hMemDC==0) MessageBox(_T( "CreateCompatibleDC Fail "),NULL,MB_OK);
// 获得选定区域坐标
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+1;
nHeight = nY2 - nY+1;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
if (hBitmap==0) MessageBox(_T( "hBitmap Create Fail "),NULL,MB_OK);
// 把新位图选到内存设备描述表中
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
//清除
if (DeleteDC(hScrDC)==0) MessageBox(_T( "hScrDC Fail "),NULL,MB_OK);
if (DeleteDC(hMemDC)==0) MessageBox(_T( "hMemDC Fail "),NULL,MB_OK);
// 返回位图句柄
return hBitmap;
这是网上搜来的一段截屏代码,在我的程序里每秒调用一次....大概一个小时左右开始出错......但始终没看出哪里有问题啊.........请高手指教....Orz...
------解决方案--------------------
句柄hBitmap和hOldBitmap没有释放,请使用DeleteObject (hBitmap)。
另外是否有内存泄漏,调试器会给予提示的,请打开该选项;还可以在任务管理器的性能中查看内存是否持续增长。
------解决方案--------------------
hScrDC = CreateDC(_TEXT( "DISPLAY "), NULL, NULL, NULL);
改为
GetDC()
最后
ReleaseDC()试试
你的问题应该是GDI资源泄露。不是内存泄露。
------解决方案--------------------
打开Windows任务管理器,把GDI对象列选上
运行你的程序,看那个值是不是一直在增加,当增加到很大时就出错
如果是这样,不是有些H对象没有删除
CopyScreenToBitmap(LPRECT 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(_TEXT( "DISPLAY "), NULL, NULL, NULL);
if (hScrDC==0) MessageBox(_T( "CreateDC Fail "),NULL,MB_OK);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
if (hMemDC==0) MessageBox(_T( "CreateCompatibleDC Fail "),NULL,MB_OK);
// 获得选定区域坐标
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+1;
nHeight = nY2 - nY+1;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
if (hBitmap==0) MessageBox(_T( "hBitmap Create Fail "),NULL,MB_OK);
// 把新位图选到内存设备描述表中
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC,0,0, nWidth,nHeight,hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
//清除
if (DeleteDC(hScrDC)==0) MessageBox(_T( "hScrDC Fail "),NULL,MB_OK);
if (DeleteDC(hMemDC)==0) MessageBox(_T( "hMemDC Fail "),NULL,MB_OK);
// 返回位图句柄
return hBitmap;
这是网上搜来的一段截屏代码,在我的程序里每秒调用一次....大概一个小时左右开始出错......但始终没看出哪里有问题啊.........请高手指教....Orz...
------解决方案--------------------
句柄hBitmap和hOldBitmap没有释放,请使用DeleteObject (hBitmap)。
另外是否有内存泄漏,调试器会给予提示的,请打开该选项;还可以在任务管理器的性能中查看内存是否持续增长。
------解决方案--------------------
hScrDC = CreateDC(_TEXT( "DISPLAY "), NULL, NULL, NULL);
改为
GetDC()
最后
ReleaseDC()试试
你的问题应该是GDI资源泄露。不是内存泄露。
------解决方案--------------------
打开Windows任务管理器,把GDI对象列选上
运行你的程序,看那个值是不是一直在增加,当增加到很大时就出错
如果是这样,不是有些H对象没有删除