啊截图数据不能保存啊

求救啊,截图数据不能保存啊!!!!!!!!!!!!!!
C/C++ code

void CDib::SaveBitmapToFile(CString& strPath)  //m_hBitmap是一个位图句柄
{ 
       //计算位图文件没像素所占位数
        HDC hDC=CreateDC("DISPLAY",NULL,NULL,NULL);
     DWORD iBits=GetDeviceCaps(hDC,BITSPIXEL);
     DeleteDC(hDC);
     DWORD wBitCount=0;
     DWORD dwPaletteSize=0;
     if(iBits<=1) wBitCount=1;
     else if(iBits<=4) wBitCount=4;
     else if(iBits<=8) wBitCount=8;
     else  wBitCount=24;  //24或者32位
          
         //计算调色板大小
     DWORD nColorTableEntries=0; //调色板项数
     if(wBitCount<=8) //》8是没有调色板,真彩色
         nColorTableEntries=(1<<wBitCount);
     dwPaletteSize=nColorTableEntries*sizeof(RGBQUAD);
     //设置位图信息头结构
    BITMAP bmp;
    if(!GetObject(m_hBitmap,sizeof(BITMAP),&bmp)) return; //从位图句柄得到位图信息

    DWORD dwBmBitsSize=(bmp.bmWidth*wBitCount+31)/32*4*bmp.bmHeight; //实际存储的位图数据大小
    //设置位图信息头结构
    BITMAPINFOHEADER bi;
    bi.biSize=sizeof(BITMAPINFOHEADER);
    bi.biWidth=bmp.bmWidth;
    bi.biHeight=bmp.bmHeight;
    bi.biPlanes=1;
    bi.biBitCount=wBitCount;
    bi.biSizeImage=dwBmBitsSize;
    bi.biXPelsPerMeter=0;
    bi.biYPelsPerMeter=0;
    bi.biClrUsed=nColorTableEntries;
    bi.biClrImportant=nColorTableEntries;

    //为位图分配内存(分配" 信息头+调色板+数据"内存)
    HANDLE hDib=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize);
    LPBITMAPINFOHEADER pbmfHdr=(LPBITMAPINFOHEADER)GlobalLock(hDib);
    if(pbmfHdr==NULL)
    {
           AfxMessageBox("内存分配失败!");
       GlobalUnlock(hDib);
       GlobalFree(hDib);
       return;
    }
    
    //处理调色板
    HPALETTE hPal,hOldPal;
    HANDLE hFile;
    hPal=(HPALETTE)GetStockObject(DEFAULT_PALETTE);
    if(hPal)
    {
        hDC=::GetDC(NULL);  //获取设备上下文
        hOldPal=(HPALETTE)::SelectPalette(hDC,hPal,FALSE); //选入调色板,并保存旧的调色板
        RealizePalette(hDC); //实现调色板
    }
    try
    {
       [color=#FF0000] if(GetDIBits(hDC,m_hBitmap,0,(UINT)bmp.bmHeight,(LPSTR)pbmfHdr+sizeof(BITMAPINFOHEADER)+dwPaletteSize,
            (LPBITMAPINFO)(pbmfHdr),DIB_RGB_COLORS)==0)[/color]//得到位图数据
        {
            throw new CException;
        }
        BITMAPFILEHEADER bmfHdr;   //构建文件头
        bmfHdr.bfType=0x4d42; //'BM'
        bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize; //位图数据偏移
        bmfHdr.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) //位图文件大小
            +dwPaletteSize +dwBmBitsSize;    
        bmfHdr.bfReserved1=bmfHdr.bfReserved2=0;
        //创建位图文件
        hFile=::CreateFile(strPath,GENERIC_WRITE,FILE_SHARE_READ,NULL,
            CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile==INVALID_HANDLE_VALUE) 
        {
            throw new CException;
        }
        
        DWORD dwNum;
        ::WriteFile(hFile,(LPCSTR)&bmfHdr,sizeof(BITMAPFILEHEADER),&dwNum,NULL); //写入文件头
        ::WriteFile(hFile,lpbi,sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize,&dwNum,NULL);//写入信息头+调色板+位图数据
    }
    catch(CException* pe)
    {
        AfxMessageBox("文件保存失败!");
        pe->Delete();
        SelectPalette(hDC,hOldPal,TRUE);//还原调色板
        ::ReleaseDC(NULL,hDC);
            GlobalUnlock(hDib); //释放内存
        GlobalFree(hDib);
        return;
    }

    SelectPalette(hDC,hOldPal,TRUE);//还原调色板
    ::ReleaseDC(NULL,hDC);
     GlobalUnlock(hDib);//释放内存
    GlobalFree(hDib);
    
}



求救啊,这是我写的一个屏幕截图保存函数,(截图后的位图句柄有m_hBitmapbaoc),可是截图后每次执行到GetDIBits这个函数就有捕捉到自己抛出的异常(即函数执行==0)啊,怎么办啊,老是卡在那过不去啊

------解决方案--------------------
C/C++ code
BOOL DibSaveImage (PTSTR pstrFileName, BITMAPFILEHEADER * pbmfh)
{
    BOOL   bSuccess ;
    DWORD  dwBytesWritten ;
    HANDLE hFile ;
    
    hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
    
    if (hFile == INVALID_HANDLE_VALUE)
        return FALSE ;
    
    bSuccess = WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL) ;
    CloseHandle (hFile) ;
    
    if (!bSuccess || (dwBytesWritten != pbmfh->bfSize))
    {
        DeleteFile (pstrFileName) ;
        return FALSE ;
    }
    return TRUE ;
}
BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
{
    BITMAP bm;
    int    iOffset, iSizeImage ;
    BYTE   *pBits;
    BITMAPFILEHEADER *pbfh;
    BITMAPINFO *pbi;
    if(NULL==hBitmap)
        return NULL;
    GetObject(hBitmap,sizeof(BITMAP),&bm);
    switch(BitCount)
    {
    case 1:
    case 4:
    case 8:
        iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount);
        break;
    case 16:
    case 24:
    case 32:
        iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        break;
    default:
        return NULL;
    }
    iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight;
    pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage);
    if(NULL==pbfh)
        return NULL;
    pBits=(BYTE *)pbfh+iOffset;
    pbi=(BITMAPINFO *)(pbfh+1);
    pbfh->bfType=0x4D42;
    pbfh->bfSize=iOffset+iSizeImage;
    pbfh->bfReserved1=0;
    pbfh->bfReserved2=0;
    pbfh->bfOffBits=iOffset;

    pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    pbi->bmiHeader.biWidth=bm.bmWidth;
    pbi->bmiHeader.biHeight=bm.bmHeight;
    pbi->bmiHeader.biPlanes=1;
    pbi->bmiHeader.biBitCount=BitCount;
    pbi->bmiHeader.biCompression=BI_RGB;
    pbi->bmiHeader.biSizeImage=iSizeImage;
    pbi->bmiHeader.biXPelsPerMeter=0;
    pbi->bmiHeader.biYPelsPerMeter=0;
    if(BitCount<16)
    {
        pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount);
    }
    else
    {
        pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0;
    }
    GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS);
    return pbfh;
}
BITMAPFILEHEADER * pbmfh=DDBToDIB(hdc,m_hBitmap,iBitCount);//iBitCount取值1.4.8.16.24.32
if(pbmfh)
{
    DibSaveImage (strPath, pbmfh) ;
    free(pbmfh);
}