-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCShareMemory.cpp
102 lines (90 loc) · 1.88 KB
/
CShareMemory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//#include "stdafx.h"
#include "CShareMemory.h"
CShareMemory::CShareMemory()
{
m_hShareMemory = NULL;
m_pMapBuffer = NULL;
m_hAccessMutex =NULL;
}
CShareMemory::~CShareMemory()
{
Close();
}
DWORD CShareMemory::Open(LPCTSTR szMapName,DWORD dwSize)
{
DWORD dwRet = 1;
if(szMapName == NULL)
return 0;
if(m_hShareMemory)
{
Close();
}
// 创建内存映射文件对象
m_hShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwSize,szMapName);
if(!m_hShareMemory)
{
return 0;
}
// 内存映射文件对象已存在
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
dwRet = 2;
}
// 获取内存映射文件指针
m_pMapBuffer = MapViewOfFile(m_hShareMemory,FILE_MAP_ALL_ACCESS,0,0,0);
if(!m_pMapBuffer)
{
CloseHandle(m_hShareMemory);
return 0;
}
// 创建互斥体,用于读写同步
TCHAR szMutexName[MAX_PATH];
_tcscpy(szMutexName, szMapName);
_tcscat(szMutexName, _T("_BTParamMutex"));
m_hAccessMutex=CreateMutex(NULL, FALSE, szMutexName);
if(!m_hAccessMutex)
{
Close();
return 0;
}
return dwRet;
}
BOOL CShareMemory::Read(void* pBuf,DWORD dwSize,DWORD dwOffset)
{
BOOL bRet = FALSE;
if(!m_pMapBuffer) return FALSE;
if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)
{
memcpy(pBuf,(BYTE*)m_pMapBuffer+dwOffset,dwSize);
bRet = TRUE;
}
ReleaseMutex(m_hAccessMutex);
return bRet;
}
BOOL CShareMemory::Write(const void* pBuf,DWORD dwSize,DWORD dwOffset)
{
BOOL bRet = FALSE;
if(!m_pMapBuffer) return FALSE;
if(WaitForSingleObject(m_hAccessMutex,INFINITE)==WAIT_OBJECT_0)
{
memcpy((BYTE*)m_pMapBuffer+dwOffset,pBuf,dwSize);
bRet = TRUE;
}
ReleaseMutex(m_hAccessMutex);
return bRet;
}
void CShareMemory::Close(void)
{
if(m_hShareMemory)
{
UnmapViewOfFile(m_pMapBuffer);
CloseHandle(m_hShareMemory);
m_pMapBuffer = NULL;
m_hShareMemory = NULL;
}
if(m_hAccessMutex)
{
CloseHandle(m_hAccessMutex);
m_hAccessMutex = NULL;
}
}