[align=left] BITMAPINFO bmi;
::ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
DWORD biSizeImage = iWidth*iHeight*64;
bmi.bmiHeader.biWidth = iWidth;
bmi.bmiHeader.biHeight = -(iHeight); //negative indicate top down, not bottom up
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biSizeImage = biSizeImage;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
bmi.bmiHeader.biCompression = BI_RGB;
VOID *pvBits;
TCHAR szName[]=TEXT("MyFileMappingObject"); DWORD biBufferSize = biSizeImage + iWidth*64;
HANDLE _hFile = CreateFile("test.bmp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(!_hFile)
return NULL;
HANDLE hMap=CreateFileMapping(_hFile, NULL, PAGE_READWRITE|SEC_COMMIT, 0, biBufferSize,szName);
if (hMap != NULL)
{
// We might have a winner
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMap);
} else {
}
} //HANDLE hMap=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, biBufferSize,szName);
if(_hFile)
{
CloseHandle(_hFile);
_hFile = NULL;
}
LPVOID pBuffer = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, biSizeImage);
if(pBuffer == NULL)
{
DWORD ErrNo = GetLastError();
}
HBITMAP hBitmap = ::CreateDIBSection(iHDC, &bmi, DIB_RGB_COLORS, &pvBits, hMap, 0); if(hBitmap == NULL)
{
DWORD ErrNo = GetLastError();
} UnmapViewOfFile(pBuffer);
CloseHandle(hMap);
if(_hFile)
CloseHandle(_hFile);
return hBitmap;
使用以上代码用内存映射的方法,创建一个大的位图,如果位图的尺寸太大的话,MapViewOfFile和CreateDIBSection都会失败,请各位专家指教,这时应该怎么处理?
::ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
DWORD biSizeImage = iWidth*iHeight*64;
bmi.bmiHeader.biWidth = iWidth;
bmi.bmiHeader.biHeight = -(iHeight); //negative indicate top down, not bottom up
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biSizeImage = biSizeImage;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
bmi.bmiHeader.biCompression = BI_RGB;
VOID *pvBits;
TCHAR szName[]=TEXT("MyFileMappingObject"); DWORD biBufferSize = biSizeImage + iWidth*64;
HANDLE _hFile = CreateFile("test.bmp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(!_hFile)
return NULL;
HANDLE hMap=CreateFileMapping(_hFile, NULL, PAGE_READWRITE|SEC_COMMIT, 0, biBufferSize,szName);
if (hMap != NULL)
{
// We might have a winner
if (GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMap);
} else {
}
} //HANDLE hMap=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, biBufferSize,szName);
if(_hFile)
{
CloseHandle(_hFile);
_hFile = NULL;
}
LPVOID pBuffer = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, biSizeImage);
if(pBuffer == NULL)
{
DWORD ErrNo = GetLastError();
}
HBITMAP hBitmap = ::CreateDIBSection(iHDC, &bmi, DIB_RGB_COLORS, &pvBits, hMap, 0); if(hBitmap == NULL)
{
DWORD ErrNo = GetLastError();
} UnmapViewOfFile(pBuffer);
CloseHandle(hMap);
if(_hFile)
CloseHandle(_hFile);
return hBitmap;
使用以上代码用内存映射的方法,创建一个大的位图,如果位图的尺寸太大的话,MapViewOfFile和CreateDIBSection都会失败,请各位专家指教,这时应该怎么处理?
因为你CreateFile指定CREATE_ALWAYS参数,文件是新创建的,大小是0,所以MapViewOfFile会失败。
比如说我将iWidth和iHeight的大小都设为1024*1024的话就都能成功,但设成10240*10240就不行。
另外,你在CreateFileMapping用if (hMap != NULL)判断的如果成功,这时再GetLastError是没有意义的。
并且CreateFile,调用后,在硬盘上也能找到相映的文件,以及大小也是我所创建的大小。
今天验证了一下:
bmi.bmiHeader.biSizeImage = biSizeImage;确实有问题,
改为:
bmi.bmiHeader.biSizeImage = 0;就可以。
结贴。