//代码如下 ,实在想不到在哪有内存泄漏.....
//放到时间响应函数里,内存暴涨
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);
//放到时间响应函数里,内存暴涨
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);
{
HBITMAP hBitmapc=m_DeskImage.Detach();
::DeleteObject(hBitmapc);//////////////////////就在这里
m_DeskImage.Destroy();
}
这个分....................................?????????????////