展示AVI文件某一帧的BMP图片,内存使用增加

显示AVI文件某一帧的BMP图片,内存使用增加
大家帮忙看下这段代码
下面这个函数通过传进来的参数将AVI视频的某一帧显示在对应的控件区域内
调用一次内存使用就增加一点,内存使用随调用次数增加而增加,多调用几次图片不能正常显示
void CCutDlg::ShowBmp(int frame)
{
CRect bmprect;
m_Picture.GetClientRect(&bmprect);
m_Picture.MoveWindow(0,0,bmprect.Width(),bmprect.Height());

PAVISTREAM ps; 
PAVIFILE pfile;
AVIFileInit(); //初始化AVIFile函数库
HRESULT hRet; //定义结果变量
hRet =  AVIFileOpen(&pfile,m_Name,OF_READ, NULL); //打开源文件
if (hRet != 0) //判断文件是否打开成功
{
MessageBox("打开源文件错误","提示"); //弹出错误提示
return;
}

AVIFILEINFO pfinfo;
AVIFileInfo(pfile,&pfinfo,sizeof(AVIFILEINFO)); 
AVIFileGetStream(pfile, &ps, streamtypeVIDEO, 0 );//获取视频流
//获取流信息
AVISTREAMINFO streaminfo;
AVIStreamInfo(ps,&streaminfo,sizeof(AVISTREAMINFO));
PGETFRAME pFrame; //定义帧接口对象
pFrame=AVIStreamGetFrameOpen(ps,NULL); //在流中打开帧
LPBITMAPINFOHEADER bih;
bih = (LPBITMAPINFOHEADER) AVIStreamGetFrame(pFrame, frame); 

BITMAPINFO Header;
memset(&Header,0,sizeof(BITMAPINFOHEADER));  
Header.bmiHeader.biBitCount=bih->biBitCount ;  
Header.bmiHeader.biSize  =  sizeof(BITMAPINFOHEADER);  
  Header.bmiHeader.biWidth  =  pfinfo.dwWidth;  
Header.bmiHeader.biHeight  =  pfinfo.dwHeight;  
Header.bmiHeader.biPlanes  =bih->biPlanes; 
Header.bmiHeader.biCompression  =BI_RGB;  
Header.bmiHeader.biXPelsPerMeter  =  0;  
Header.bmiHeader.biYPelsPerMeter  =  0;

BITMAPFILEHEADER stFileHdr;
stFileHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
stFileHdr.bfSize=sizeof(BITMAPFILEHEADER);
stFileHdr.bfType= ((WORD)('M'<< 8)|'B');

BYTE* pDIB=new BYTE[(((pfinfo.dwWidth*Header.bmiHeader.biBitCount)+31)/8)*pfinfo.dwHeight];
BYTE* lpbuff; 
lpbuff=pDIB;  
lpbuff=(BYTE *)AVIStreamGetFrame(pFrame,frame); 
lpbuff+=40;  

CClientDC dc(this);  //生成一个与当前窗口相关的CClientDC
HBITMAP m_hBitmap;
//生成DIBitmap数据
m_hBitmap = CreateDIBitmap(dc.m_hDC,&Header.bmiHeader,CBM_INIT,lpbuff,&Header,DIB_RGB_COLORS);
delete[] pDIB;

AVIStreamGetFrameClose(pFrame);
if (m_hBitmap != NULL)
{
m_Picture.SetBitmap(m_hBitmap);
m_Picture.UpdateData();
}
BITMAP bmp;
GetObject(m_hBitmap,sizeof(bmp),&bmp);
CRect rect;
m_fDlg->GetClientRect(rect);
int xpos = m_fDlg->GetScrollPos(SB_HORZ);
if (xpos != 0)
m_fDlg->ScrollWindow(xpos,0); //恢复窗口的水平滚动区域
int ypos = m_fDlg->GetScrollPos(SB_VERT);
if (ypos != 0)
m_fDlg->ScrollWindow(0,ypos); //恢复窗口的垂直滚动区域

SCROLLINFO vinfo;
vinfo.cbSize = sizeof(vinfo);
vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmHeight/10;
vinfo.nMax= bmp.bmHeight-rect.Height()+bmp.bmHeight/10;
vinfo.nMin = 0;
vinfo.nTrackPos = 0;
vinfo.nPos = 0;
//设置垂直滚动条信息
m_fDlg->SetScrollInfo(SB_VERT,&vinfo);

vinfo.fMask = SIF_ALL;
vinfo.nPage = bmp.bmWidth/10;
vinfo.nMax= bmp.bmWidth-rect.Width()+bmp.bmWidth/10;
vinfo.nMin = 0;
vinfo.nPos  = 0;
vinfo.nTrackPos = 0;