www.pudn.com > Wave_Src_func.zip > MemoryMapper.cpp
//////////////////////////////////////////////////////////////////////////////////////////
// Implementation of the CMemoryMapper class. See .h for details.
// -Vinayak Raghuvamshi
//////////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include ".\MemoryMapper.h"
CMemoryMapper::CMemoryMapper(void): m_pFileData(NULL),
m_dwSize(0),
m_hFile(INVALID_HANDLE_VALUE),
m_hMapOfFile(NULL),
m_pViewOfFile(NULL)
{
}
CMemoryMapper::~CMemoryMapper(void)
{
try
{
Close();
}
catch(...)
{
}
}
// Opens a file for reading and creates a view of it. Fails if file does not exist.
bool CMemoryMapper::OpenFileForRead(const TCHAR *szFile)
{
Close();
m_hFile = CreateFile( szFile,
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if(INVALID_HANDLE_VALUE == m_hFile)
return false;
return MapFile(m_hFile,PAGE_READONLY,FILE_MAP_READ);
}
// Opens a file mapping for writing. use if we want to modify the file
bool CMemoryMapper::OpenFileForWrite(const TCHAR *szFile)
{
Close();
m_hFile = CreateFile( szFile,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
if(INVALID_HANDLE_VALUE == m_hFile)
return false;
return MapFile(m_hFile,PAGE_READWRITE,FILE_MAP_READ|FILE_MAP_WRITE);
}
void CMemoryMapper::Close(void)
{
if(m_hMapOfFile)
{
CloseHandle(m_hMapOfFile);
m_hMapOfFile = NULL;
}
if(m_pViewOfFile)
{
UnmapViewOfFile(m_pViewOfFile);
m_pViewOfFile = NULL;
}
if(INVALID_HANDLE_VALUE != m_hFile)
{
CloseHandle(m_hFile);
}
m_dwSize = 0;
m_pFileData = NULL;
}
// internal open method that gets invoked by open for read and open for write....
bool CMemoryMapper::MapFile(const HANDLE &hFile,DWORD dwPageProtect, DWORD dwPageAccess)
{
m_dwSize = GetFileSize(hFile,0);
if(NULL == (m_hMapOfFile = CreateFileMapping(hFile,NULL,dwPageProtect,NULL,m_dwSize,NULL)))
{
Close();
return false;
}
if(NULL == (m_pViewOfFile = MapViewOfFile(m_hMapOfFile,dwPageAccess,0,0,m_dwSize)))
{
DWORD dwErr = GetLastError();
Close();
return false;
}
m_pFileData = reinterpret_cast< BYTE* >(m_pViewOfFile);
return true;
}