进程间通信之共享内存

来源:互联网 发布:织梦网站源码 编辑:程序博客网 时间:2024/04/29 10:27

//写入端

//创建共享内存void C写入端Dlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码//创建共享内存handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, DEF_DATA_SIZE, L"ShareMemSample");//映射共享内存if(handle){lpData = MapViewOfFile(handle, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);::MessageBox(NULL, L"创建共享内存映射文件成功", L"消息", MB_OK);}else{::MessageBox(NULL, L"创建共享内存映射文件失败", L"消息", MB_OK);}}//关闭共享内存void C写入端Dlg::OnBnClickedButton2(){// TODO: 在此添加控件通知处理程序代码//撤销映射的共享内存if(lpData){UnmapViewOfFile(lpData);}//关闭共享内存if(handle){CloseHandle(handle);}}//写数据到共享内存void C写入端Dlg::OnBnClickedButton3(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);int iLen = data.GetLength()*2 +2;LPWSTR lpBuf = data.GetBuffer(iLen);//写入共享内存memcpy(lpData, lpBuf, iLen);HWND  hWnd = ::FindWindow(NULL, L"接收端");//通知到接收端if(hWnd){::PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0);}}

//读取端

//重载PreTranslateMessage处理SHARE_MEM_NOTIFY数据更新通知消息BOOL C接收端Dlg::PreTranslateMessage( MSG* pMsg ){if(pMsg->message == SHARE_MEM_NOTIFY){OnBnClickedButton1();}return CDialog::PreTranslateMessage(pMsg);}//从共享内存读取数据void C接收端Dlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码//打开共享内存HANDLE hMapFile = OpenFileMapping(FILE_MAP_READ, false, L"ShareMemSample");if(hMapFile == NULL){::MessageBox(NULL, L"打开共享内存失败", L"消息", MB_OK);return;}//映射共享内存LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);if(lpBase == NULL){::MessageBox(NULL, L"打开共享内存映射文件失败", L"消息", MB_OK);return ;}//读取共享内存数据data.Format(L"%s", (LPWSTR)lpBase);UpdateData(false);//卸载映射的共享内存UnmapViewOfFile(lpBase);//关闭共享内存CloseHandle(hMapFile);}


 C接收端Dlg.cpp 和 C发送端Dlg.cpp 中必须自定义消息#define SHARE_MEM_NOTIFY (WM_USER+1)。

发送端往共享内存里写好数据后,PostMessage(hWnd, SHARE_MEM_NOTIFY, 0, 0); hWnd是接收端窗口句柄,可以用FindWindow(NULL, L"接收端");获得。在接收端重写PreTranslateMessage处理SHARE_MEM_NOTIFY消息。

CreateFileMapping(),MapViewOfFile(),OpenFileMapping()对这个三函数的使用参照MSDN。

原创粉丝点击