📄 subject_57250.htm
字号:
<p>
序号:57250 发表者:最后一根稻草 发表日期:2003-10-23 20:49:03
<br>主题:一个内存使用错误!!寻求帮助
<br>内容:看书做一个屏幕取图程序,不过运行时发生了错误,错误的位置我已找到,不过对于内存的使用我实在很糟糕,高手指点。源码在附件中。<BR>HGLOBAL CMyBitmap4Doc::ConvertDDBtoDIB (CBitmap *pBmp)<BR>{<BR> BITMAP bm;<BR> BITMAPINFOHEADER bi;<BR> LPBITMAPINFO lpBi;<BR> DWORD dwSizeCT;<BR> DWORD dwDibLen;<BR> CMyBitmap4View*ptrView;<BR> POSITION pos;<BR> HGLOBAL hDib;<BR> LPLOGPALETTE lpLogPal;<BR> int i;<BR> CPalette palSys;<BR> CPalette *pPalOld;<BR> RGBQUAD rgbQuad[PALETTE_SIZE];<BR><BR> pos=GetFirstViewPosition();<BR> ptrView=(CMyBitmap4View*)GetNextView(pos);<BR> ASSERT(ptrView->IsKindOf(RUNTIME_CLASS(CMyBitmap4View)));<BR> CClientDC dc(ptrView);<BR><BR> lpLogPal=(LPLOGPALETTE)::GlobalAlloc<BR> (<BR> GMEM_FIXED,<BR> sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*(PALETTE_SIZE-1)<BR> );<BR> lpLogPal->palVersion =0x300;<BR> lpLogPal->palNumEntries =PALETTE_SIZE;<BR><BR> for(i=0;i<PALETTE_SIZE;i++)<BR> {<BR> *((WORD*)(&lpLogPal->palPalEntry [i].peRed))=i;<BR> lpLogPal->palPalEntry[i].peBlue=0;<BR> lpLogPal->palPalEntry [i].peFlags=PC_EXPLICIT;<BR> }<BR><BR> VERIFY(palSys.CreatePalette(lpLogPal));<BR> pPalOld=dc.SelectPalette(&palSys,FALSE);<BR> dc.RealizePalette();<BR><BR> pBmp->GetBitmap(&bm);<BR> bi.biSize=sizeof(BITMAPINFOHEADER);<BR> bi.biWidth=bm.bmWidth;<BR> bi.biHeight=bm.bmHeight ;<BR> bi.biPlanes=bm.bmPlanes;<BR><BR><BR> bi.biBitCount =bm.bmPlanes*bm.bmBitsPixel;<BR> bi.biCompression=BI_RGB;<BR> bi.biSizeImage=0;<BR> bi.biXPelsPerMeter =0;<BR> bi.biYPelsPerMeter =0;<BR> bi.biClrUsed=0;<BR> bi.biClrImportant =0;<BR><BR> dwSizeCT=GetColorTableSize(bi.biBitCount);<BR> dwDibLen=bi.biSize+dwSizeCT*sizeof(RGBQUAD);<BR><BR> hDib=::GlobalAlloc(GHND,dwDibLen);<BR> lpBi=(LPBITMAPINFO)::GlobalLock(hDib);<BR> AfxMessageBox("lpBi=(LPBITMAPINFO)::GlobalLock(hDib);");<BR> lpBi->bmiHeader=&bi;//错误在此处!!!!!<BR> AfxMessageBox("lpBi->bmiHeader=bi;");<BR> VERIFY<BR> (::GetDIBits (dc.GetSafeHdc (),(HBITMAP)pBmp->GetSafeHandle (),<BR> 0,<BR> (WORD)bi.biHeight ,<BR> NULL,<BR> lpBi,<BR> DIB_RGB_COLORS<BR> )<BR> );<BR><BR> memcpy((LPSTR)rgbQuad,(LPSTR)lpBi->bmiColors ,sizeof(RGBQUAD)*PALETTE_SIZE);<BR><BR> for(i=0;i<PALETTE_SIZE;i++)<BR> {<BR> lpLogPal->palPalEntry[i].peRed=rgbQuad[i].rgbRed;<BR> lpLogPal->palPalEntry[i].peGreen =rgbQuad[i].rgbGreen ;<BR> lpLogPal->palPalEntry[i].peBlue =rgbQuad[i].rgbBlue ;<BR> lpLogPal->palPalEntry[i].peFlags =NULL;<BR> }<BR> ASSERT(m_palDraw.GetSafeHandle()!=NULL);<BR> m_palDraw.SetPaletteEntries(0,PALETTE_SIZE,lpLogPal->palPalEntry );<BR> ::GlobalFree(lpLogPal);<BR><BR> bi=lpBi->bmiHeader;<BR> ::GlobalUnlock(hDib);<BR> if(bi.biSizeImage==0)<BR> {<BR> bi.biSizeImage=WIDTHBYTES(bi.biBitCount*bi.biWidth)*bi.biHeight;<BR> }<BR> dwDibLen+=bi.biSizeImage;<BR> hDib=::GlobalReAlloc(hDib,dwDibLen,GHND);<BR> ASSERT(hDib);<BR> lpBi=(LPBITMAPINFO)::GlobalLock(hDib);<BR> ASSERT(hDib);<BR> VERIFY<BR> (<BR> ::GetDIBits(<BR> dc.GetSafeHdc (),<BR> (HBITMAP)pBmp->GetSafeHandle (),<BR> 0,<BR> (WORD)bi.biHeight,<BR> (LPSTR)lpBi+sizeof(BITMAPINFOHEADER)+dwSizeCT*sizeof(RGBQUAD),<BR> lpBi,<BR> DIB_RGB_COLORS)<BR> );<BR> ::GlobalUnlock(hDib);<BR> dc.SelectPalette(pPalOld,FALSE);<BR> <BR> return hDib;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:秋叶禅 回复日期:2003-10-24 09:05:46
<br>内容:问题在这:<BR>dwSizeCT=GetColorTableSize(bi.biBitCount);<BR>当bi.biBitCount = 32或者16位时:你的GetColorTableSize并没有处理。<BR>如果你将系统颜色改乘256色就可以了。(我想你的系统颜色应该是32位的吧)<BR>导致dwSizeCT是错误的数据<BR>从而<BR>hDib=::GlobalAlloc(GHND,dwDibLen);这个地方失败(分配HEAP失败)<BR>lpBi=(LPBITMAPINFO)::GlobalLock(hDib);<BR> AfxMessageBox("lpBi=(LPBITMAPINFO)::GlobalLock(hDib);");<BR> lpBi->bmiHeader= bi;//lpBit指向一个空,因为根本就没有分配内存。所以就报错了。<BR>2003-10-24 9:08:21
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -