读书人

帮小弟我看看msdn中有段代码是不是有

发布时间: 2012-06-04 14:48:03 作者: rapoo

大虾,帮我看看msdn中有段代码是不是有点小错误?
[code=C/C++][/code]/*************************************************************************

Function: ReadDIBFile (CFile&)

Purpose: Reads in the specified DIB file into a global chunk of
memory.

Returns: A handle to a dib (hDIB) if successful.
NULL if an error occurs.

Comments: BITMAPFILEHEADER is stripped off of the DIB. Everything
from the end of the BITMAPFILEHEADER structure on is
returned in the global memory handle.

*************************************************************************/


HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
UINT nBitsSize;
HDIB hDIB;
LPSTR pDIB;

/*
* get length of DIB in bytes for use when reading
*/

nBitsSize = (UINT)file.GetLength();

/*
* Go read the DIB file header and check if it's valid.
*/
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return NULL;

if (bmfHeader.bfType != DIB_HEADER_MARKER)
return NULL;

/*
* Allocate memory for DIB
*/
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, (DWORD)nBitsSize);
if (hDIB == 0)
{
return NULL;
}
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

/*
* Go read the bits.
*/
if (file.Read(pDIB, nBitsSize - sizeof(BITMAPFILEHEADER)) !=
nBitsSize - sizeof(BITMAPFILEHEADER) )
{
::GlobalUnlock((HGLOBAL) hDIB);
::GlobalFree((HGLOBAL) hDIB);
return NULL;
}
::GlobalUnlock((HGLOBAL) hDIB);
return hDIB;
}
这是msdn中 dibapi.cpp中代码。个人觉得:
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, (DWORD)nBitsSize);
应该改成:
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, (DWORD)nBitsSize-sizeof(BITMAPFILEHEADER));
因为DIB中的空间不包含文件头的。

[解决办法]
多申请写空间也没什么坏处

读书人网 >C++

热点推荐