xiaonvzi5678 2013-09-30 13:29 采纳率: 0%
浏览 2860

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

#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条回答 默认 最新

  • Eleven 2015-01-04 11: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.

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog