当前位置:网站首页>MFC Interprocess Communication (Shared Memory)
MFC Interprocess Communication (Shared Memory)
2022-08-11 05:02:00 【DuGuYiZhao】
应用:32位SDK与64An inter-process communication
目录
1.定义
共享文件句柄、Mapping buffer view
// FW64To32Dlg.h : 头文件
HANDLE shared_file; //共享文件句柄
LPVOID lpBUF; //Mapping buffer view
bool bStopRev; //停止接收
// FW64To32Dlg.cpp : 实现文件
#include <iostream>
#include <comdef.h>
#include <Windows.h>
using namespace std;
#define BUF_SIZE 4096
HANDLE H_Mutex = NULL;
HANDLE H_Event = NULL;
HANDLE H_Mutex_REV = NULL;
HANDLE H_Event_REV = NULL;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define EXCHANGE_REV_SEND 1
#if EXCHANGE_REV_SEND
#define REV_E_TEXT L"sm_event_rev"
#define REV_M_TEXT L"sm_mutex_rev"
#define E_TEXT L"sm_event"
#define M_TEXT L"sm_mutex"
#else
#define REV_E_TEXT L"sm_event"
#define REV_M_TEXT L"sm_mutex"
#define E_TEXT L"sm_event_rev"
#define M_TEXT L"sm_mutex_rev"
#endif
1.1接收线程
采用:AfxBeginThread方式
UINT ThreadProc(LPVOID pParam)
{
CFW64To32Dlg* pThis = (CFW64To32Dlg*)pParam;
if(pThis== NULL)
{
return 0;
}
//循环接收
char Buff[97];
while(1&&!(pThis->bStopRev))
{
WaitForSingleObject(H_Event_REV, INFINITE);
WaitForSingleObject(H_Mutex_REV, INFINITE);//Use the mutex lock
memcpy(Buff, pThis->lpBUF, strlen((char*)(pThis->lpBUF))+1);
ReleaseMutex(H_Mutex_REV);
int nSizeBuff=strlen(Buff);
Buff[nSizeBuff] = '\0';
CString szTest(Buff);
//szTest.Format(_T("%s"),Buff);//乱码
CString cStrReceive;
pThis->m_TxtReceive.GetWindowText(cStrReceive);
cStrReceive +=L"\r\n" + szTest;
pThis->m_TxtReceive.SetWindowText(cStrReceive);
}
AfxEndThread(1);
return 0;
}
2.初始化
创建共享文件句柄
Mapping buffer view,得到指向共享内存的指针
启动接收线程:AfxBeginThread
BOOL CFW64To32Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中.
// ...
// TODO: 在此添加额外的初始化代码
//S1:创建共享文件句柄
shared_file= CreateFileMapping(INVALID_HANDLE_VALUE,//物理文件句柄CreateFileMapping
NULL,//默认安全级别
PAGE_READWRITE,//可读可写
0,//高位文件大小
BUF_SIZE,//低位文件大小
L"ShareMemory"//共享内存名称
);
if(shared_file == NULL)
{
cout<<"Could not create file mapping object..."<<endl;
return 1;
}
//S2:Mapping buffer view,得到指向共享内存的指针
lpBUF = MapViewOfFile(
shared_file,//The created file mapping object handle
FILE_MAP_ALL_ACCESS,//访问模式:可读写
0,//File offset high32位
0,//File offset low32位
BUF_SIZE
);
if(lpBUF==NULL)
{
cout<<"Could not create file mapping object..."<<endl;
CloseHandle(shared_file);
return 1;
}
//发送
H_Mutex = CreateMutex(NULL, FALSE, M_TEXT);
H_Event = CreateEvent(NULL, FALSE, FALSE, E_TEXT);
//接收
H_Mutex_REV = CreateMutex(NULL, FALSE, REV_M_TEXT);
H_Event_REV = CreateEvent(NULL, FALSE, FALSE, REV_E_TEXT);
bStopRev=false;
CWinThread* pThread = AfxBeginThread(ThreadProc, this);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
3.发送
操作共享内存:填充数据;
void CFW64To32Dlg::OnBnClickedSend()
{
// TODO: 在此添加控件通知处理程序代码
CString strSend;
m_TxtSend.GetWindowText(strSend);
if(strSend=="" )
{
::AfxMessageBox(L"发送内容不能为空!");
m_TxtSend.SetFocus();
return;
}
//S3:操作共享内存
wchar_t* wBuff=(LPTSTR)(LPCTSTR)strSend;
_bstr_t b(wBuff);
const char* Buff = b;
WaitForSingleObject(H_Mutex, INFINITE);//Use the mutex lock
memcpy(lpBUF, Buff, strlen(Buff)+1);
ReleaseMutex(H_Mutex);
SetEvent(H_Event);
}
4.退出
停止接收
Lift the map and close the handle
void CFW64To32Dlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
bStopRev=true;
SetEvent(H_Event_REV);
Sleep(1000);
CloseHandle(H_Mutex);
CloseHandle(H_Event);
CloseHandle(H_Mutex_REV);
CloseHandle(H_Event_REV);
//S4:Lift the map and close the handle
UnmapViewOfFile(lpBUF);
CloseHandle(shared_file);
CDialogEx::OnClose();
}
边栏推荐
- 如何将360全景图导出高清短视频分享到视频平台上?
- IP-Guard如何禁止运行U盘程序
- [E-commerce operation] How to formulate a social media marketing strategy?
- 走出迷宫的最短路径
- 3 模块二:科研工具使用
- c语言fprintf、fscanf、sscanf以及sprintf函数知识要点总结
- ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: '/data/xxxx
- form表单提交数据库中文变成问号
- Smart Pointer Notes
- About data paging display
猜你喜欢
ALSA音频架构 -- aplay播放流程分析
交换机和路由器技术-27-OSPF路由重分发
Paper Notes: Bag of Tricks for Long-Tailed Visual Recognition with Deep Convolutional Neural Networks
ERROR: Could not install packages due to an OSError: [Errno 2] 没有那个文件或目录: ‘/data/xxxx
MySQL必知必会(初级篇)
网络技能树
Word2021 中的图片保存后就变模糊了
Switch and Router Technology-34-Dynamic NAT
交换机和路由器技术-22/23-OSPF动态路由协议/链路状态同步过程
How to switch Green Shield encryption to IP-Guard encryption smoothly
随机推荐
交换机和路由器技术-26-OSPF末梢区域配置
form表单提交数据库中文变成问号
Events and scheduled tasks in Mysql
交换机和路由器技术-27-OSPF路由重分发
Switches and routers technology - 21 - RIP routing protocol
C语言:实用调试技巧
2021 Network Planning Designer Afternoon Case Questions
如何阅读论文
交换机和路由器技术-28-OSPF的NSSA区域
4 模块三:文献阅读与研究方法
leetcode 9. Palindromic Numbers
交换机和路由器技术-29-OSPF虚链路
澳大利亚网络空间安全体系建设论析
交换机和路由器技术-30-标准ACL
Redis deletes keys in batches according to regular rules
leetcode 9. 回文数
网络安全培训机构哪家好?排名怎么选择?
Australia cyberspace security system construction
K8s复习笔记7--Redis单机和Redis-cluster的K8S实现
K8s Review Notes 7--K8S Implementation of Redis Standalone and Redis-cluster