远程桌面截图内存泄漏的有关问题,
远程桌面截图内存泄漏的问题,在线等..................................
//代码如下 ,实在想不到在哪有内存泄漏.....
//放到时间响应函数里,内存暴涨
HWND hDeskWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hDeskWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;
::GetWindowRect(hDeskWnd,&rect);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,rect.right,rect.bottom);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
::BitBlt(MemDC,0,0,rect.right,rect.bottom,hScreenDC,rect.left,rect.top,SRCCOPY);
hBitmap=(HBITMAP)::SelectObject(MemDC,hOldBMP);
m_DeskImage.Attach(hBitmap);
IStream* pStmImage = NULL;
HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//可移动的缓冲区
if (hMemBmp == NULL) return NULL;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将内存区B作为流的起始
if (pStmImage == NULL)
{
GlobalFree(hMemBmp);
MessageBox( "为空 ");
return NULL;
}
m_DeskImage.Save(pStmImage,Gdiplus::ImageFormatJPEG);
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);//得到缓冲区的起始地址
//CFile mfile( "234.jpg ",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
GlobalUnlock(hMemBmp);
//mfile.Write(pbyBmp,GlobalSize(hMemBmp));
//mfile.Close();
int msize=GlobalSize(hMemBmp);
int seek=0;
int sndcount=0;
m_gpackage.ncount=msize;
while (1)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,3072);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
seek+=3072;
//TRACE( "%d,seek:%d,size:%d\n ",sndcount,seek,msize);
if(msize-seek <=3072)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,msize-seek);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
break;
}
}
pStmImage-> Release();
GlobalFree(hMemBmp);
if(m_DeskImage)
{
m_DeskImage.Detach();
m_DeskImage.Destroy();
}
::DeleteObject(hBitmap);
//::ReleaseDC(hDeskWnd,MemDC)
::DeleteObject(MemDC);
::DeleteDC(MemDC);
::ReleaseDC(hDeskWnd,hScreenDC);
::DeleteDC(hScreenDC);
------解决方案--------------------
顶
------解决方案--------------------
嗯。句柄也是会导致泄露的。一定要仔细了。
------解决方案--------------------
这些东西装个Boundchecker就可以很容易找出来的.
------解决方案--------------------
up,纯属jf
//代码如下 ,实在想不到在哪有内存泄漏.....
//放到时间响应函数里,内存暴涨
HWND hDeskWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hDeskWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;
::GetWindowRect(hDeskWnd,&rect);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,rect.right,rect.bottom);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
::BitBlt(MemDC,0,0,rect.right,rect.bottom,hScreenDC,rect.left,rect.top,SRCCOPY);
hBitmap=(HBITMAP)::SelectObject(MemDC,hOldBMP);
m_DeskImage.Attach(hBitmap);
IStream* pStmImage = NULL;
HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//可移动的缓冲区
if (hMemBmp == NULL) return NULL;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将内存区B作为流的起始
if (pStmImage == NULL)
{
GlobalFree(hMemBmp);
MessageBox( "为空 ");
return NULL;
}
m_DeskImage.Save(pStmImage,Gdiplus::ImageFormatJPEG);
BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);//得到缓冲区的起始地址
//CFile mfile( "234.jpg ",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
GlobalUnlock(hMemBmp);
//mfile.Write(pbyBmp,GlobalSize(hMemBmp));
//mfile.Close();
int msize=GlobalSize(hMemBmp);
int seek=0;
int sndcount=0;
m_gpackage.ncount=msize;
while (1)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,3072);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
seek+=3072;
//TRACE( "%d,seek:%d,size:%d\n ",sndcount,seek,msize);
if(msize-seek <=3072)
{
memcpy(m_gpackage.m_buf,pbyBmp+seek,msize-seek);
sndcount=m_clientsock.Send(&m_gpackage,sizeof(package));
break;
}
}
pStmImage-> Release();
GlobalFree(hMemBmp);
if(m_DeskImage)
{
m_DeskImage.Detach();
m_DeskImage.Destroy();
}
::DeleteObject(hBitmap);
//::ReleaseDC(hDeskWnd,MemDC)
::DeleteObject(MemDC);
::DeleteDC(MemDC);
::ReleaseDC(hDeskWnd,hScreenDC);
::DeleteDC(hScreenDC);
------解决方案--------------------
顶
------解决方案--------------------
嗯。句柄也是会导致泄露的。一定要仔细了。
------解决方案--------------------
这些东西装个Boundchecker就可以很容易找出来的.
------解决方案--------------------
up,纯属jf