⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_57250.htm

📁 vc
💻 HTM
字号:
<p>
序号:57250 发表者:最后一根稻草 发表日期:2003-10-23 20:49:03
<br>主题:一个内存使用错误!!寻求帮助
<br>内容:看书做一个屏幕取图程序,不过运行时发生了错误,错误的位置我已找到,不过对于内存的使用我实在很糟糕,高手指点。源码在附件中。<BR>HGLOBAL CMyBitmap4Doc::ConvertDDBtoDIB (CBitmap *pBmp)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAP bm;<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER bi;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFO lpBi;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwSizeCT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwDibLen;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMyBitmap4View*ptrView;<BR>&nbsp;&nbsp;&nbsp;&nbsp;POSITION pos;<BR>&nbsp;&nbsp;&nbsp;&nbsp;HGLOBAL hDib;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LPLOGPALETTE lpLogPal;<BR>&nbsp;&nbsp;&nbsp;&nbsp;int i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CPalette palSys;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CPalette *pPalOld;<BR>&nbsp;&nbsp;&nbsp;&nbsp;RGBQUAD rgbQuad[PALETTE_SIZE];<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pos=GetFirstViewPosition();<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptrView=(CMyBitmap4View*)GetNextView(pos);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(ptrView-&gt;IsKindOf(RUNTIME_CLASS(CMyBitmap4View)));<BR>&nbsp;&nbsp;&nbsp;&nbsp;CClientDC dc(ptrView);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal=(LPLOGPALETTE)::GlobalAlloc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GMEM_FIXED,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*(PALETTE_SIZE-1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palVersion =0x300;<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palNumEntries =PALETTE_SIZE;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;PALETTE_SIZE;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((WORD*)(&amp;lpLogPal-&gt;palPalEntry [i].peRed))=i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry[i].peBlue=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry [i].peFlags=PC_EXPLICIT;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(palSys.CreatePalette(lpLogPal));<BR>&nbsp;&nbsp;&nbsp;&nbsp;pPalOld=dc.SelectPalette(&amp;palSys,FALSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.RealizePalette();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;pBmp-&gt;GetBitmap(&amp;bm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSize=sizeof(BITMAPINFOHEADER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biWidth=bm.bmWidth;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biHeight=bm.bmHeight ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biPlanes=bm.bmPlanes;<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biBitCount =bm.bmPlanes*bm.bmBitsPixel;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biCompression=BI_RGB;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biXPelsPerMeter =0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biYPelsPerMeter =0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrUsed=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrImportant =0;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwSizeCT=GetColorTableSize(bi.biBitCount);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dwDibLen=bi.biSize+dwSizeCT*sizeof(RGBQUAD);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDib=::GlobalAlloc(GHND,dwDibLen);<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpBi=(LPBITMAPINFO)::GlobalLock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;lpBi=(LPBITMAPINFO)::GlobalLock(hDib);&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpBi-&gt;bmiHeader=&amp;bi;//错误在此处!!!!!<BR>&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;lpBi-&gt;bmiHeader=bi;&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(::GetDIBits (dc.GetSafeHdc (),(HBITMAP)pBmp-&gt;GetSafeHandle&nbsp;&nbsp;(),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(WORD)bi.biHeight ,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBi,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;memcpy((LPSTR)rgbQuad,(LPSTR)lpBi-&gt;bmiColors ,sizeof(RGBQUAD)*PALETTE_SIZE);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;PALETTE_SIZE;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry[i].peRed=rgbQuad[i].rgbRed;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry[i].peGreen =rgbQuad[i].rgbGreen ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry[i].peBlue =rgbQuad[i].rgbBlue ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palPalEntry[i].peFlags =NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_palDraw.GetSafeHandle()!=NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_palDraw.SetPaletteEntries(0,PALETTE_SIZE,lpLogPal-&gt;palPalEntry );<BR>&nbsp;&nbsp;&nbsp;&nbsp;::GlobalFree(lpLogPal);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi=lpBi-&gt;bmiHeader;<BR>&nbsp;&nbsp;&nbsp;&nbsp;::GlobalUnlock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(bi.biSizeImage==0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage=WIDTHBYTES(bi.biBitCount*bi.biWidth)*bi.biHeight;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;dwDibLen+=bi.biSizeImage;<BR>&nbsp;&nbsp;&nbsp;&nbsp;hDib=::GlobalReAlloc(hDib,dwDibLen,GHND);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;lpBi=(LPBITMAPINFO)::GlobalLock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetDIBits(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc.GetSafeHdc (),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HBITMAP)pBmp-&gt;GetSafeHandle (),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(WORD)bi.biHeight,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPSTR)lpBi+sizeof(BITMAPINFOHEADER)+dwSizeCT*sizeof(RGBQUAD),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBi,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;::GlobalUnlock(hDib);<BR>&nbsp;&nbsp;&nbsp;&nbsp;dc.SelectPalette(pPalOld,FALSE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;lpBi=(LPBITMAPINFO)::GlobalLock(hDib);&#34;);<BR>&nbsp;&nbsp; lpBi-&gt;bmiHeader= bi;//lpBit指向一个空,因为根本就没有分配内存。所以就报错了。<BR>2003-10-24 9:08:21

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -