#pragma once
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <windows.h>
template<class T>
class CMySM
{
public:
CMySM()
{
m_pMem = NULL;
m_hMem = NULL;
}
~CMySM()
{
Close();
}
BOOL Create(LPCTSTR szName)
{
if (szName == NULL || _tcslen(szName) == 0)
return FALSE;
do
{
m_hMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE | SEC_COMMIT, 0, sizeof(T), szName);
if (m_hMem == NULL)
break;
m_pMem = MapViewOfFile(m_hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (m_pMem == NULL)
break;
memset(m_pMem, 0, sizeof(T));
return TRUE;
}
while (FALSE);
Close();
return FALSE;
}
BOOL Open(LPCTSTR szName)
{
if (szName == NULL || _tcslen(szName) == 0)
return FALSE;
do
{
m_hMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
if (m_hMem == NULL)
break;
m_pMem = MapViewOfFile(m_hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (m_pMem == NULL)
break;
return TRUE;
}
while (FALSE);
Close();
return FALSE;
}
void Close()
{
if (m_pMem != NULL)
{
UnmapViewOfFile(m_pMem);
m_pMem = NULL;
}
if (m_hMem != NULL)
{
CloseHandle(m_hMem);
m_hMem = NULL;
}
}
inline T* Get(){return (T*)m_pMem;}
public:
PVOID m_pMem;
HANDLE m_hMem;
};