内存映射
来源:互联网 发布:ubuntu caffe 教程 编辑:程序博客网 时间:2024/05/22 01:52
首先,进程A 创建一个命名内存映射对象
其次,进程B 通过名称来访问进程A创建的内存映射对象
上面操作都成功后就可以进行通信,通信的同步处理可以用命名的事件、信号量等内核对象来实现
//创建内存映射对象 static HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE , NULL , PAGE_READWRITE|SEC_COMMIT , 0,sizeof(DWORD) ,L"FileMapLink"); if (NULL == hFileMap) { switch(GetLastError()) { case ERROR_FILE_INVALID: TRACE("CreateFileMapping Error:企图创建一个零长度的文件映射\r\n"); break; case ERROR_INVALID_HANDLE: TRACE("CreateFileMapping Error:ERROR_INVALID_HANDLE\r\n"); break; case ERROR_ALREADY_EXISTS: TRACE("CreateFileMapping Error:已有一个同名内存映射存在.\r\n"); break; } return; } //访问内存映射对象 static VOID* pViewMap = MapViewOfFile( hFileMap , FILE_MAP_WRITE //访问方式 , 0, 0, 0); if (NULL == pViewMap) { TRACE("MapViewOfFile Error:访问内存映射对象失败.\r\n"); return; } //向映射内存写入数据 *((DWORD*)pViewMap) = GetCurrentProcessId(); //创建一个通知事件 static HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, L"EventLink"); if (NULL == hEvent) { TRACE("CreateEvent Error:创建失败.\r\n"); return; } //通知对方,内存中已有数据,可以进行读取 SetEvent(hEvent); //不使用是,释放资源 UnmapViewOfFile(pViewMap); CloseHandle(hFileMap); CloseHandle(hEvent);
下面展示,进程B如何来访问进程A的数据
static HANDLE hFileMap = OpenFileMapping(FILE_MAP_READ, FALSE, L"FileMapLink"); if (NULL == hFileMap) { TRACE("OpenFileMapping Error:打开内存映射对象失败.\r\n"); } else { static HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, L"EventLink"); if (NULL == hEvent) { TRACE("OpenEvent Error:访问事件失败.\r\n"); } else { if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 5000)) { static void* pBuf = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); if (pBuf) { DWORD dwCurrProcessID = *((DWORD*)pBuf); TRACE("CMockShim>> OXProvider ProcessID = %d", dwCurrProcessID); //LOGON_INFO* pstLogonInfo = (LOGON_INFO*)pBuf; //TRACE("pstLogonInfo->szUserName = %s\r\n", pstLogonInfo->szUserName); //TRACE("pstLogonInfo->szUserPwd = %s\r\n", pstLogonInfo->szUserPwd); } UnmapViewOfFile(pBuf); } } }
CloseHandle(hFileMap);
CloseHandle(hEvent);
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 内存映射
- 单例模式(单一实例) C++版本
- HTMl5的sessionStorage和localStorage
- [转载]addSubview和insertSubview的区别
- 使用jquery操作iframe
- 监听器
- 内存映射
- 应用程序之间的交互
- 欲为Java技术大牛所需的25个学习要点
- 我的程序员之路
- 解析 Linux 内核可装载模块的版本检查机制
- Linux ED编辑器的使用
- 浅析SQL Server的锁机制
- MD5加密