2。使用共享内存方式(Shared Memory)
a.设定一块共享内存区域
HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)
产生一个file-mapping核心对象
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
得到共享内存的指针
b.找出共享内存
决定这块内存要以点对点(peer to peer)的形式呈现
每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。
还是要使用client/server架构中
只有server进程才应该产生并初始化共享内存。所有的进程都应该使用
HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);
再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
CloseHandle()
这个创建内存共享我觉得是最简单的方法:
代码实现
//共内存句柄 HANDLE m_hwdShareMemery; //共享内存映射 char* m_strBufStart; void OnBnClickedBtnCreate() { m_hwdShareMemery = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 2048, _T("TestMem")); if (m_hwdShareMemery == NULL) { AfxMessageBox(_T("Create Share Memery Failed !")); } } void OnBnClickedBtnMap() { HANDLE handleFile = NULL; handleFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, _T("TestMem")); m_strBufStart = (char*)MapViewOfFile(handleFile, FILE_MAP_ALL_ACCESS, 0, 0, 2048); } void OnBnClickedBtnWrite() { CString str; m_edtWrite.GetWindowTextW(str); int nStrLen = str.GetLength(); sprintf_s(m_strBufStart,nStrLen*2, "%S", str); m_edtWrite.SetWindowTextW(_T("")); } void OnBnClickedBtnRead() { CString strRead(m_strBufStart); m_edtRead.SetWindowTextW(strRead); }