VC 进程间通信 共享内存
2013-05-24 00:00
441 查看
进程通常被定义为一个正在运行的程序的实例, 为了能在两个进程之间进行通讯,我们可以通过下面的方法来实现:
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()
这个创建内存共享我觉得是最简单的方法:
代码实现
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); }
相关文章推荐
- Linux环境进程间通信(五): 共享内存(上)
- linux进程间通信之共享内存(system v)
- 转载:Linux环境进程间通信-共享内存
- Linux 进程间通信(IPC)之三 --- 共享内存
- linux进程间通信之共享内存
- Linux进程间通信——使用共享内存
- 进程间通信系列 之 共享内存简单实例
- windows 进程间通信(共享内存)
- 6、进程间通信-共享内存
- Linux环境进程间通信(五): 共享内存
- Linux 进程间通信 - 共享内存shmget方式(转)
- 进程间通信之-共享内存Shared Memory--linux内核剖析(十一)
- 进程间通信(IPC)——信号量、共享内存、消息队列
- 进程间通信方式之(四)共享内存
- Linux环境进程间通信之共享内存(上)
- Linux环境进程间通信: 共享内存
- Linux进程间通信源码剖析,共享内存(mmap)
- 进程间通信(8) - 共享内存(posix)
- 进程间通信(四)—共享内存
- Linux环境进程间通信(五): 共享内存(上)