程序很简单,对话框上一个按钮,点了之后就依次打开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);
}
{
// 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);
}
解决方案 »
- 怎样防止截屏
- ATL 对话框 控件大小随窗体大小变化而变化 onsize怎么写
- 新手求助,关于ShellExecute()在vc6和vs2008下的问题
- 急求用子对话框向父对话框上ListCtrl上指定的列传递参数??
- 求TCHAR版的atof
- 如何获得EXCEL表中的最大值
- 多线程在单步调试时是轮流执行各线程的,还是只在一个线程里面转来转去?
- 关于多线程写多文件的问题,妹愿以高分相赠!!!!!!
- 关于"output窗口" 输出的信息。
- ActiveX 封装 多文档(采用bcg中的Ribbon模式),程序关闭以后其中dll不能释放,造成进程关闭不了
- 画jpg图时碰到的一个内存问题
- 高分赠送,这个棘手的问题如何去解决,关于读取仪器里的数据的问题。
因为:1.我在网上找到的例子是这样教的,原来我一点都不懂这些
2.这个小程序只是个例子。实际上我在编程时,是将所有小文件合并在一个大文件里,初始化时将大文件一次性读入,然后从内存里读出一个一个的小文件,这样节省了很多读文件消耗的时间。但是,我碰到了内存泄露的问题,所以举这么一个简单的例子来陈述我碰到的问题继续急盼高人指点
{
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,250000);
//... GlobalFree(hGlobal);
}
我在一开始的问题中就说了,虽然把GlobalAlloc和GlobalFree放在循环里面不会出现错误,但实际上GlobalFree不起作用