程序很简单,对话框上一个按钮,点了之后就依次打开jpg文件,把它们画出来。但是其中的内存访问总是出错,程序如下。另外,如果把hGlobal放在循环里面,作为一个局部变量,那么虽然没有内存出错,但调用GlobalFree不起作用,直到该函数运行完毕,才会把每次分配的内存全部释放。哪位高人能指点一下?谢谢!void CTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
CFileStatus fstatus;
CFile file;
LONG cb,dwAll=200;
CString strPath="e:\\flow\\dx3\\down.%04d";

HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,25000);
IPicture *pPic;

for(int i=0;i<=dwAll;i++)
{
CString strName;
strName.Format(strPath,i);
if(file.Open(strName,CFile::modeRead)&&file.GetStatus(strName,fstatus)&&((cb=fstatus.m_size)!=-1))
{
LPVOID pvData=NULL;
if((pvData=GlobalLock(hGlobal))!=NULL)
{
file.ReadHuge(pvData,cb);
GlobalUnlock(hGlobal);
IStream *pStream;
CreateStreamOnHGlobal(hGlobal,TRUE,&pStream);
if(!SUCCEEDED(OleLoadPicture(pStream,cb,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
AfxMessageBox("图象读取错误!",MB_OK|MB_ICONEXCLAMATION);
return;
}
pPic->Render(*GetDC(),10,10,175,502,0,10000,10000,-10000,NULL);
pStream->Release();
pPic->Release();
}
else
{
AfxMessageBox("内存访问错误",MB_OK|MB_ICONEXCLAMATION);
return;
}
file.Close();
}
else
AfxMessageBox("打不开文件");
}
GlobalFree(hGlobal);
}

解决方案 »

  1.   

    为什么不用OleLoadPicturePath函数呢?很简单,不需要这么麻烦!
      

  2.   

    re: handwolf(青松崖)
    因为:1.我在网上找到的例子是这样教的,原来我一点都不懂这些
          2.这个小程序只是个例子。实际上我在编程时,是将所有小文件合并在一个大文件里,初始化时将大文件一次性读入,然后从内存里读出一个一个的小文件,这样节省了很多读文件消耗的时间。但是,我碰到了内存泄露的问题,所以举这么一个简单的例子来陈述我碰到的问题继续急盼高人指点
      

  3.   

    可以把GlobalAlloc和 GlobalFree放在循环里面。for(int i=1;i<=dwAll;i++)
    {
        HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,250000);

        //...    GlobalFree(hGlobal);
    }
      

  4.   

    re: handwolf(青松崖)
    我在一开始的问题中就说了,虽然把GlobalAlloc和GlobalFree放在循环里面不会出现错误,但实际上GlobalFree不起作用