进程间共享内存操作,其中有加锁读写
头文件中定义共享名称和互斥量名称
const LPCTSTR sMemoryFileName = _T("MyShareName");//指定内存映射文件名称
const LPCTSTR sMutexName = _T("MyMutexName");//指定Mutex名称
HANDLE CreateOpenFileMapping(LPCTSTR lpShareMemName)
{
//打开共享的文件对象。
HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, lpShareMemName);
if (hMapFile)
{
}
else
{
//创建共享文件。
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, lpShareMemName);
}
return hMapFile;
}
///函数主要对共享内存读写
///hMapFile :共享内训映射句柄
///bInOutData:写入或者读取数据
///lpMutexName:互斥量名字
///bRW :读写标志 0 read ; 1 write
///返回值 ture成功 ;false 失败
/
BOOL OperateData(HANDLE hMapFile, BYTE *bInOutData, LPCTSTR lpMutexName, bool bRW)
{
BOOL bSuc = FALSE;
BYTE *pBuf = (BYTE *)MapViewOfFile(
hMapFile, // 共享内存的句柄
FILE_MAP_ALL_ACCESS, // 可读写许可
0,
0,
BUF_SIZE
);
if (pBuf)
{
//加把锁在这地方
HANDLE hMutex = CreateMutex(NULL, FALSE, lpMutexName);
if (hMutex && WaitForSingleObject(hMutex, 30 * 1000) == WAIT_OBJECT_0)
{
if (bRW)
{
memset(pBuf, 0, BUF_SIZE);
memcpy(pBuf, bInOutData, BUF_SIZE - 1);
}
else
{
memcpy(bInOutData, pBuf, BUF_SIZE - 1);
}
ReleaseMutex(hMutex);
CloseHandle(hMutex);
UnmapViewOfFile(pBuf);
hMutex = NULL;
pBuf = NULL;
bSuc = TRUE;
}
}
return bSuc;
}