49 lines
1.1 KiB
C++
49 lines
1.1 KiB
C++
#include "mmf.h"
|
|
|
|
/**
|
|
*/
|
|
CMMF::CMMF(LPCTSTR MMFName, int size, LPCTSTR mutexName) :
|
|
m_nSize(size),
|
|
m_hMutex(0)
|
|
{
|
|
m_hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, m_nSize, MMFName);
|
|
m_pSharedData = MapViewOfFile(m_hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
|
|
|
|
if(mutexName != NULL)
|
|
m_hMutex = CreateMutex(NULL, FALSE, mutexName);
|
|
}
|
|
|
|
/**
|
|
*/
|
|
CMMF::~CMMF(void)
|
|
{
|
|
UnmapViewOfFile(m_pSharedData);
|
|
CloseHandle(m_hFileMapping);
|
|
|
|
if(m_hMutex)
|
|
CloseHandle(m_hMutex);
|
|
}
|
|
|
|
/**
|
|
* Copies the current contents of the MMF into pData (buffer must be big enough to receive m_nSize bytes).
|
|
* Waits for locked mutex to be released if mutex name was specified during construction.
|
|
*/
|
|
void CMMF::Read(void* pData, bool read /* = TRUE */)
|
|
{
|
|
if(m_hMutex)
|
|
WaitForSingleObject(m_hMutex, INFINITE);
|
|
|
|
memcpy(read ? pData : m_pSharedData, read ? m_pSharedData : pData, m_nSize);
|
|
|
|
if(m_hMutex)
|
|
ReleaseMutex( m_hMutex );
|
|
}
|
|
|
|
/**
|
|
* Copies the contents of pData into the MMF, waiting for the MMF lock to be released if applicable.
|
|
*/
|
|
void CMMF::Write(void* pData)
|
|
{
|
|
Read(pData, false);
|
|
}
|