[
html]
class WinSharedMemory
{
public:
WinSharedMemory(string szkey = "");
~WinSharedMemory();
bool CreateSize(int size);
void *Data();
const void *ConstData() const;
bool Attach();
bool Detach();
bool IsAttach();
bool Lock();
bool UnLock();
int Size();
void Setkey(string szKey);
string Key();
string GetErrorMessage();
protected:
void cleanHandle();
private:
string m_errorMessage;
int m_size;
string m_memKey;
bool m_isLock;
HANDLE m_mutex;
HANDLE m_fileMapping;
void *m_pMemory;
};
[html]
WinSharedMemory::WinSharedMemory( string szkey /*= ""*/ ):m_memKey(szkey)
,m_isLock(false),m_mutex(NULL),m_pMemory(NULL),m_size(0),m_fileMapping(NULL)
{
}
WinSharedMemory::~WinSharedMemory()
{
this->Setkey("");
}
bool WinSharedMemory::CreateSize( int size )
{
if (m_memKey == "")
{
m_errorMessage = "没有设置共享内存名";
return false;
}
if (size < 1)
{
m_errorMessage = "设置内存大小必须大于0";
return false;
}
m_size = size;
m_fileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,m_size,m_memKey.c_str());
if (m_fileMapping == NULL)
{
m_errorMessage ="创建共享内存失败";
return false;
}
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
m_errorMessage ="共享内存已存在";
return false;
}
return true;
}
void * WinSharedMemory::Data()
{
return m_pMemory;
}
const void * WinSharedMemory::ConstData() const
{
return m_pMemory;
}
bool WinSharedMemory::Attach()
{
if (m_fileMapping)
{
m_pMemory = (void *)MapViewOfFile(m_fileMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if (m_pMemory == NULL)
{
m_errorMessage = "映射内存失败";
return false;
}
}
return true;
}
bool WinSharedMemory::Lock()
{
if (!m_isLock)
{
string szMutexkey = m_memKey + "_mutex";
m_mutex = CreateMutex(NULL,false,szMutexkey.c_str());
WaitForSingleObject(m_mutex,INFINITE);
m_isLock = true;
}
else
{
m_errorMessage = "内存已被锁定";
return false;
}
}
bool WinSharedMemory::IsAttach()
{
return (m_pMemory != NULL);;
}
bool WinSharedMemory::UnLock()
{
if (m_isLock)
{
ReleaseMutex(m_mutex);
m_isLock = false;
}
return true;
}
int WinSharedMemory::Size()
{
return m_size;
}
void WinSharedMemory::Setkey( string szKey )
{
m_memKey = szKey;
}
string WinSharedMemory::Key()
{
return m_memKey;
}
string WinSharedMemory::GetErrorMessage()
{
return m_errorMessage;
}
bool WinSharedMemory::Detach()
{
if (!UnmapViewOfFile(m_pMemory))
{
m_errorMessage = "释放共享内存失败";
return false;
}
m_size = 0;