class CFileMapping
{
protected:
HANDLE _hFile;
HANDLE _hFileMapping;
PVOID _pvView;
public:
// Ctor for real file mapping object
CFileMapping(LPCTSTR pszFile, DWORD dwAccess = FILE_GENERIC_READ | FILE_GENERIC_WRITE,
DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE, PSECURITY_ATTRIBUTES psa = NULL,
BOOL bMap = TRUE, LPCTSTR pszObject = NULL)
: _hFile(NULL), _hFileMapping(NULL), _pvView(NULL)
{
_hFile = CreateFile(pszFile, dwAccess, dwShareMode, psa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(!_hFile)
return;
_hFileMapping = CreateFileMapping(_hFile, psa, PAGE_READWRITE, 0, 0, pszObject);
if(_hFileMapping && bMap)
_pvView = Map();
}
// Ctor for shared memory object, not implemented, your duty? :-)
CFileMapping(DWORD dwMaximumSizeLow, DWORD dwMaximumSizeHigh = 0, LPCTSTR pszObject = NULL)
: _hFile(NULL), _hFileMapping(NULL), _pvView(NULL)
{
}
~CFileMapping()
{
Unmap();
if(_hFileMapping)
CloseHandle(_hFileMapping);
if(_hFile && _hFile != INVALID_HANDLE_VALUE)
CloseHandle(_hFileMapping);
}
PVOID Map(SIZE_T dwNumberOfBytesToMap = 0, DWORD dwFileOffsetLow = 0, DWORD dwFileOffsetHigh = 0,
DWORD dwAccess = FILE_MAP_ALL_ACCESS, PVOID pvBaseAddress = NULL)
{
Unmap();
if(_hFileMapping == NULL)
return NULL;
_pvView = MapViewOfFileEx(_hFileMapping, dwAccess, dwFileOffsetHigh, dwFileOffsetLow,
dwNumberOfBytesToMap, pvBaseAddress);
return _pvView;
}
void Unmap()
{
if(_pvView)
{
UnmapViewOfFile(_pvView);
_pvView = NULL;
}
}
BOOL IsMapped()
{
return _pvView != NULL;
}
PVOID GetView()
{
return _pvView;
}
};
HBITMAP WINAPI LoadBitmap32Bits(LPCTSTR pszFile)
{
CFileMapping fm(pszFile);
PBYTE pBytes = (PBYTE)fm.GetView();
if(!pBytes)
return NULL;
PBITMAPFILEHEADER pbfh = (PBITMAPFILEHEADER)pBytes;
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)(pBytes + sizeof(BITMAPFILEHEADER));
if(pbih->biBitCount != 32)
return NULL;
PBYTE pBits = NULL;
HBITMAP hbmp = CreateDIBSection(NULL, (PBITMAPINFO)pbih, DIB_RGB_COLORS, (PVOID*)&pBits, NULL, 0);
if(!hbmp || !pBits)
return NULL;
pBytes += (pbfh->bfOffBits ? pbfh->bfOffBits : (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)));
SIZE_T size = pbih->biWidth * pbih->biHeight * 4;
CopyMemory(pBits, pBytes, size);
return hbmp;
}</span>