程序間共享記憶體操作,其中有加鎖讀寫
頭檔案中定義共享名稱和互斥量名稱
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;
}