请问一个显示图像的有关问题

请教一个显示图像的问题
在vc++下实现一个最简单的打开图像并显示。编译时没问题,但运行时弹出个对话框
说"0x004157bd 处未处理的异常: 0xC0000005: 读取位置 0xcdcdcdd1 时发生访问冲突"
我想可能是读图像文件时,出错了,可是代码看了半天,没有头绪.希望高手帮忙,先谢谢了.
下面时代码:
这个事消息映射函数:
void CPressImageView::OnOpenimage() 
{
LPCTSTR lpszFileName ="*.bmp";
CString FileNameIn;
DWORD dwFlags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
CFileDialog FileDlg(TRUE,NULL,lpszFileName,dwFlags,NULL);
FileNameIn.Empty();
if(FileDlg.DoModal() == IDOK)
{
FileNameIn=FileDlg.GetPathName ();
}

  CPressImageDoc * myDoc = GetDocument();
   
if(myDoc->m_MakeImageBa.LoadBmp(FileNameIn))
  {  
myDoc->m_MakeImageBa.Draw(myDoc->m_pDC);
  }
  else 
{
CClientDC pDC(this);
pDC.TextOut(10,10,"装载BMP文件出错了");
  }
}

这个是读bmp文件到内存:
BOOL MakeImageBa::LoadBmp(const char * pszFileName )
{
  CFile cf;
BITMAPFILEHEADER BFH;
DWORD dwDibSize;
if(!cf.Open(pszFileName,CFile::modeRead))
return (FALSE);

dwDibSize =cf.GetLength () - sizeof(BITMAPFILEHEADER); //去掉文件头后的大小
  //计算设备无关位图尺寸
   

if(m_pDib != NULL) 
delete [] m_pDib; //删除原来图像

  m_pDib = new BYTE [dwDibSize]; //分配内存

if(m_pDib ==NULL) //如果分配失败,返回FALSE
return (FALSE);
  if(cf.Read((LPVOID)&BFH,sizeof(BITMAPFILEHEADER)) //文件头读入BFH中
!= sizeof(BITMAPFILEHEADER)
||
BFH.bfType !='MB' //判断是否是bmp文件
||
  cf.Read(m_pDib,dwDibSize) != dwDibSize ) //从读完文件头的地方开始读
//但不知道能么,可能是重新读
{
delete [] m_pDib;
return (FALSE);
}  
cf.Close();
   
if(m_pDib != NULL) delete [] m_pDib1;
m_pDib1 = new BYTE [dwDibSize] ;
if(m_pDib1 == NULL) return (FALSE);
memcpy(m_pDib1,m_pDib,dwDibSize);

return (TRUE);
}

设置相关参数
void MakeImageBa::SetBidParam(BYTE *pDib)
{
  BITMAPINFOHEADER *pBIH;
m_pBI= (BITMAPINFO *)pDib;
pBIH= (BITMAPINFOHEADER * ) pDib;
wid = pBIH->biWidth;
hei = pBIH->biHeight;
bits = pBIH->biBitCount;
colors = 1<<pBIH->biBitCount;
if(pBIH->biBitCount>8) colors = 0;
else if (pBIH->biClrUsed!=0) colors = pBIH->biClrUsed;

m_pBits = & pDib[sizeof(BITMAPINFOHEADER) + colors * sizeof(RGBQUAD)]; //得像素数据指针

bpl = (wid *bits+31)/32*4; //计算每行字节数
bpp =(bits +7)/8; //计算每像素字节数
size = 40L + colors * 4 +bpl * hei; //计算图像尺寸

}

显示图像:
BOOL MakeImageBa::Draw(CDC * pDC)
{
if(m_pDib == NULL)
return (FALSE);
SetBidParam(m_pDib);
   
StretchDIBits(pDC->m_hDC,0,0,wid,hei,0,0,wid,hei,
m_pBits,m_pBI,
DIB_RGB_COLORS,SRCCOPY);

return (TRUE);
}


------解决方案--------------------
确实挺乱!!重新写吧,应该是读错了,可能是在读时超出了范围或读时指针没用好,下面是我的代码,你参考一下:

void CXXXView::OnFileOpen() 
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp)|*.bmp"),NULL);
CString fileName;

if(dlg.DoModal()==IDCANCEL)
return ;
fileName=dlg.GetPathName();


CFile bitmapFile;
CFileException fileException;
if(!bitmapFile.Open(fileName,CFile::modeRead,&fileException))
{
TRACE("Can't open file %s,error=%u\n",fileName,fileException.m_cause);
}

m_pBmpFileHeader=(BITMAPFILEHEADER*) new char [sizeof(BITMAPFILEHEADER)];//给文件信息头分配内存