2 xiaonvzi5678 xiaonvzi5678 于 2013.09.30 21:29 提问

内存泄露?内存一直不断增长,纠结~~看不出来哪里泄露了,大神指点!

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include
#include
#include
using namespace Gdiplus;
#pragma comment(lib,"gdiplus")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")

int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName)
{

HDC hDC; //设备描述表
int iBits;//当前显示分辨率下每个像素所占字节数
WORD wBitCount;//位图中每个像素所占字节数

DWORD dwPaletteSize=0;//定义调色板大小
DWORD dwBmBitsSize;//位图中像素字节大小
DWORD dwDIBSize;// 位图文件大小
DWORD dwWritten;//写入文件字节数
BITMAP Bitmap;//位图结构
BITMAPFILEHEADER bmfHdr; //位图属性结构
BITMAPINFOHEADER bi; //位图文件头结构
LPBITMAPINFOHEADER lpbi; //位图信息头结构 指向位图信息头结构
HANDLE fh = NULL;//定义文件句柄
HANDLE hDib;//分配内存句柄
HANDLE hPal;//分配内存句柄
HANDLE hOldPal=NULL;//调色板句柄

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 16;
else if (iBits<=32)
wBitCount = 24;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) sizeof(RGBQUAD);
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)
4*Bitmap.bmHeight ;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
if (lpbi==NULL)
{
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 0;
}
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
//恢复调色板

if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
//创建位图文件

fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)
{
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return FALSE;
}
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;

bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除

GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return 1;
}

HBITMAP GetCaptureBmp()

{
HDC hDC;

HDC MemDC;

BYTE* Data;

HBITMAP hBmp;

BITMAPINFO bi;

memset(&bi, 0, sizeof(bi));

bi.bmiHeader.biSize = sizeof(BITMAPINFO);
bi.bmiHeader.biWidth = GetSystemMetrics(SM_CXSCREEN);

bi.bmiHeader.biHeight = GetSystemMetrics(SM_CYSCREEN);

bi.bmiHeader.biPlanes = 1;

bi.bmiHeader.biBitCount = 24;

hDC = GetDC(NULL);

MemDC = CreateCompatibleDC(hDC);

hBmp = CreateDIBSection(MemDC, &bi, DIB_RGB_COLORS, (void**)&Data, NULL, 0);

SelectObject(MemDC, hBmp);

BitBlt(MemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,hDC, 0, 0, SRCCOPY);

ReleaseDC(NULL, hDC);

DeleteDC(MemDC);

return hBmp;

}

int tmain(int argc, _TCHAR* argv[])
{
char receiveName[128] = "\0";
while(1)
{
time_t now_time;
now_time = time(NULL);
struct tm *local,*ptr;
local=localtime(&now_time);//localtime()函数是将日历时间转化为本地时间
sprintf(receiveName,"E:\%d-%d-%d
%d-%d-%d_OK.png\0",
local->tm_year + 1900,local->tm_mon + 1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
HBITMAP hBmp;
hBmp = GetCaptureBmp();
SaveBitmapToFile(hBmp, receiveName);
Sleep(1000);
}
return 0;
}

1个回答

VisualEleven
VisualEleven   Ds   Rxr 2015.01.04 19:37

CreateDIBSection:

As noted above, if hSection is NULL, the system allocates memory for the DIB. The system closes the handle to that memory when you later delete the DIB by calling the DeleteObject function. If hSection is not NULL, you must close the hSection memory handle yourself after calling DeleteObject to delete the bitmap.

You cannot paste a DIB section from one application into another application.

Csdn user default icon
上传中...
上传图片
插入图片