天天看點

程序間共享記憶體操作簡易封裝

程序間共享記憶體操作,其中有加鎖讀寫

頭檔案中定義共享名稱和互斥量名稱

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;
}
           

繼續閱讀