2,644
社区成员




BOOL LoadBmpFile (char *BmpFileName)
{
HFILE hf;
LPBITMAPV5HEADER lpImgData;// LCS_sRGB='sRGB' BITMAPV4HEADER
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
DWORD ImgSize;
DWORD i;
// DWORD all;
DWORD mask3[3];// [0]=0xFF00 0000; [1]=0x00FF 0000 ;[2]=0x0000 FF00
// all= sizeof(BITMAPINFOHEADER); // 0x28 40
// all= sizeof(BITMAPV4HEADER); // 0x6C 108
// all= sizeof(BITMAPV5HEADER); // 0x7C 124
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR)
{
MessageBox(0,BmpFileName,"Error Not Found",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
strcpy(g_BmpFileName,BmpFileName);
//
_lread(hf,(LPSTR)&g_bf,sizeof(BITMAPFILEHEADER));
_lread(hf,(LPSTR)&g_bi,sizeof(BITMAPV5HEADER));
//
if(g_bi.bV5Size !=124)
{
_lclose(hf);
return TRUE;
}
ImgWidth=g_bi.bV5Width; //900
ImgHeight=g_bi.bV5Height;//1257
if(g_bi.bV5Compression == BI_BITFIELDS)//3
{//DWORD RedMask; DWORD GreenMask; DWORD BlueMask;
_lread(hf,mask3,sizeof(mask3));
}
//
LineBytes=(DWORD)WIDTHBYTES(g_bi.bV5Width*g_bi.bV5BitCount);
ImgSize=(DWORD)LineBytes*g_bi.bV5Height;
if(g_bi.bV5ClrUsed!=0)
NumColors=(DWORD)g_bi.bV5ClrUsed;
else
{
switch(g_bi.bV5BitCount)
{
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break;
case 24:
NumColors=0;
break;
case 32:
NumColors=0;
break;
default:
MessageBox(0,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
}
if(g_bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPV5HEADER)))
{
MessageBox(0,"Invalid color numbers!","Error Message" ,MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
g_bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPV5HEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPV5HEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox(0,"Error alloc memory!","ErrorMessage",MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
lpImgData=(LPBITMAPV5HEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPV5HEADER)+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf);
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);
pPal->palNumEntries =(WORD) NumColors;
pPal->palVersion = 0x300;
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPV5HEADER));
for (i = 0; i < NumColors; i++)
{
pPal->palPalEntry[i].peRed=lpRGB->rgbRed;
pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;
pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;
pPal->palPalEntry[i].peFlags=(BYTE)0;
lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=GetDC(0);
if(hPalette)
{
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}// int WINAPI GetDIBits(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT);
hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPV5HEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData,
DIB_RGB_COLORS);
if(hPalette && hPrevPalette)
{
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc);
}
ReleaseDC(0,hDc);
GlobalUnlock(hImgData);
return TRUE;
}
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
DebugPrint(L"GlobalSize Error Code = %d excCode=%d", GetLastError(), code);
if (code == EXCEPTION_ACCESS_VIOLATION)
{
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
SIZE_T GetGlobalSize(HANDLE hMem)
{
DebugPrint(L"GlobalSize star");
SIZE_T size;
__try
{
size = ::GlobalSize(hMem);
}
__except(filter(GetExceptionCode(), GetExceptionInformation()))
{
size = 0;
}
return size;
}
DbgView打印的内容:
[7036] GlobalSize star
[7036] GlobalSize star
[6364] GlobalSize star
[6364] GlobalSize star
[6364] GlobalSize star
[6364] GlobalSize star
[6364] GlobalSize star
[3844] 487 试图访问无效的地址。 (这里就开始崩溃了,没有到我要打印的地方)
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。
[3844] 487 试图访问无效的地址。