+ -
当前位置:首页 → 问答吧 → BMP位图显示unhandled exception in MDI.exe(gdi32.dll):0xc0000005:Access violation

BMP位图显示unhandled exception in MDI.exe(gdi32.dll):0xc0000005:Access violation

时间:2011-11-30

来源:互联网

多文档/视图(BMP位图的加载与显示)
文档类中
public:
void GetBmpIfo();
int m_nBitCount;
BYTE *m_pDibData;
int m_nHeight;
int m_nWidth;
LPBITMAPINFO m_pBitmapInfo;
CString m_FileName;
CFile m_File;
HGLOBAL m_hDIB;
BOOL CMDIexampleDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

// TODO: Add your specialized creation code here
m_FileName=lpszPathName;
GetBmpIfo();
return TRUE;
}

void CMDIexampleDoc::GetBmpIfo()
{
m_File.Open(m_FileName,CFile::modeRead);//以只读的方式打开位图
BITMAPFILEHEADER bitmapFileHeader; //位图文件的文件头
UINT bitmapFileHeaderSize = m_File.Read((void*) &bitmapFileHeader,sizeof(BITMAPFILEHEADER));//将位图文件的文件头读到文件头变量中
DWORD dwFileLength = m_File.GetLength();//位图文件的大小(长度)
DWORD dwSize = dwFileLength - sizeof(BITMAPFILEHEADER);//获取位图信息头和像素数据的大小(文件长度 - 位图文件头的长度)
m_hDIB = (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE,dwSize);//为位图信息头和像素数据分配大小
BYTE *m_pdib = (BYTE *)::GlobalLock((HGLOBAL)m_hDIB);//锁定分配的内存,将返回指向此内存的指针
DWORD dwReadSize = m_File.Read((void *)m_pdib,dwSize);//将位图信息头和像素数据一起读入到已分配的内存中
//获取位图信息头和位图信息的指针
//位图信息头指针用来获取位图的宽带、高度和每个像素所占字节数
//位图信息指针用来在StretchDIBits中显示位图时的参数
m_pBitmapInfo = (BITMAPINFO *)m_pdib;
BITMAPINFOHEADER *m_pBitmapinfoHeader = (BITMAPINFOHEADER *)m_pdib;
m_nWidth = m_pBitmapinfoHeader->biWidth;
m_nHeight = m_pBitmapinfoHeader->biHeight;
m_nBitCount = m_pBitmapinfoHeader->biBitCount;
m_pDibData = (BYTE *)m_pdib + m_pBitmapinfoHeader->biSize;
  ::GlobalUnlock((HGLOBAL)m_hDIB);//释放锁定的内存
}
视图类中
private:
BYTE *m_pDibData;
int m_nHeight;
int m_nWidth;
LPBITMAPINFO m_pBitmapInfo;
void CMDIexampleView::OnDraw(CDC* pDC)
{
CMDIexampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
m_nWidth = pDoc->m_nWidth;
m_nHeight = pDoc->m_nHeight;
m_pBitmapInfo = pDoc->m_pBitmapInfo;
m_pDibData = pDoc->m_pDibData;
StretchDIBits(pDC->m_hDC,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);}
调试运行时,一运行到StretchDIBits(pDC->m_hDC,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,m_pDibData,m_pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);函数就出现unhandled exception in xxx.exe(GDI32.DLL):ox0000005:access violation求解答

作者: jx_feixian   发布时间: 2011-11-30

将APP类中的InitInstance()函数中的
  if (!ProcessShellCommand(cmdInfo))  
return FALSE;
改成
  if(cmdInfo.m_strFileName == "")
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
即可解决该问题

作者: jx_feixian   发布时间: 2011-11-30