请看下面的代码,为什么我用CreateDIBSection函数返回的句柄都是0 ???
不得其解,请大虾指教,分来了。void CMemmapDlg::OnOK() 
{
// TODO: Add extra validation here

HANDLE hFile;    hFile=::CreateFile("C:\\sj.bmp",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(!hFile)
{
MessageBox("CreateFile error ");
}
HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL); LPVOID lpBase = ::MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0); BITMAPFILEHEADER *pFileHeader;
BITMAPINFO *pInfoHeader; pFileHeader=(BITMAPFILEHEADER*)lpBase;
if(pFileHeader->bfType!=MAKEWORD('B','M'))
{
MessageBox("No bitmap");
return;
}
BYTE *pBits=(BYTE*)lpBase+pFileHeader->bfOffBits;
pInfoHeader = (BITMAPINFO*)((BYTE*)lpBase+sizeof(BITMAPFILEHEADER));
m_nHeight= pInfoHeader->bmiHeader.biHeight;
         m_nWidth=pInfoHeader->bmiHeader.biWidth; CClientDC dc(this);
VOID* p;

             HBITMAP hbit=::CreateDIBSection(dc.m_hDC,pInfoHeader,
DIB_RGB_COLORS,&p,hMap,1024);
    code=GetLastError();
::SelectObject(m_memdc,hbit); ::InvalidateRect(m_hWnd,NULL,TRUE);
::DeleteObject(hbit);
::UnmapViewOfFile(lpBase);
::CloseHandle(hMap);
::CloseHandle(hFile);
// CDialog::OnOK();
}

解决方案 »

  1.   

    BYTE *pBits=(BYTE*)lpBase+pFileHeader->bfOffBits;
    去掉这一句,否则你传入的pInfoHeader是错误的(实际传入的是真正的图像数据
      

  2.   

    HBITMAP hbit=::CreateDIBSection(dc.m_hDC,pInfoHeader,
    DIB_RGB_COLORS,&p,NULL,0);memcpy(p,pBits,datasize)..
      

  3.   

    楼上的两位大哥:
       楼1:  *pBits根本就没有使用到,不好意思写在这里误导你了,传进去的是BITMAPINFOHEADER,不是BITMAPFILEHEADER。所以你说的应该不对!
       楼2:   很明显我用的是内存映射文件,你把我的内存映射文件句柄hMap放着不用,改用NULL,我不知道你这样得出来的hbit是否能用。谢谢你们的回复,期待更多的解答谢谢!