当前位置:网站首页>MFC 进程间通信(共享内存)
MFC 进程间通信(共享内存)
2022-08-11 04:57:00 【DuGuYiZhao】
应用:32位SDK与64位进程间通信
目录
1.定义
共享文件句柄、映射缓冲区视图
// FW64To32Dlg.h : 头文件
HANDLE shared_file; //共享文件句柄
LPVOID lpBUF; //映射缓冲区视图
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"
#endif1.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);//使用互斥体加锁
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.初始化
创建共享文件句柄
映射缓冲区视图,得到指向共享内存的指针
启动接收线程: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:映射缓冲区视图,得到指向共享内存的指针
lpBUF = MapViewOfFile(
shared_file,//已创建的文件映射对象句柄
FILE_MAP_ALL_ACCESS,//访问模式:可读写
0,//文件偏移的高32位
0,//文件偏移的低32位
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);//使用互斥体加锁
memcpy(lpBUF, Buff, strlen(Buff)+1);
ReleaseMutex(H_Mutex);
SetEvent(H_Event);
}4.退出
停止接收
解除映射和关闭句柄
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:解除映射和关闭句柄
UnmapViewOfFile(lpBUF);
CloseHandle(shared_file);
CDialogEx::OnClose();
}边栏推荐
- [FPGA tutorial case 50] Control case 2 - FPGA-based PD controller verilog implementation
- c语言fprintf、fscanf、sscanf以及sprintf函数知识要点总结
- Development Tools Lecture 7: Alibaba Cloud Log Query and Analysis
- About the pom.xml file
- form表单提交数据库中文变成问号
- 项目实战第二十七讲:状态模式在重名品牌中的应用
- Add PRODUCT_BOOT_JARS and classes to provide jar packages to applications
- zabbix构建企业级监控告警平台
- 网络安全培训机构哪家好?排名怎么选择?
- 标识密码技术在 IMS 网络中的应用
猜你喜欢

CAD2020 打开错误报告 e06d7363h Exception at 13644F69h

交换机和路由器技术-33-静态NAT

Apache初体验

form form submission database Chinese becomes a question mark

Switch and Router Technology-27-OSPF Route Redistribution

Paper Notes: BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition

2021年网络规划设计师下午案例题

Do you understand how the Selenium automated testing framework works?

Switch and Router Technology-31-Extended ACL

Object Creation and Display Transformation
随机推荐
K8s复习笔记7--Redis单机和Redis-cluster的K8S实现
一起Talk编程语言吧
Network Skill Tree
vector中resize() 用法排坑
[Server installation Redis] Centos7 offline installation of redis
FPGA工程师面试试题集锦111~120
嵌入式分享合集33
关于CC 攻击
The principle, architecture, implementation, practice of "transfer" and "search", no need to be afraid of interviews
我的LaTeX入门
【小记】BatchSize的数值是设置的越大越好吗
Licking - frog jumping steps
应用层协议——DNS
绿盾加密如何顺利切换成IP-Guard加密
Object Creation and Display Transformation
如何将360全景图导出高清短视频分享到视频平台上?
Switch and Router Technology-29-OSPF Virtual Link
一种基于共识机制的数字集群终端防失控方案研究
Merkel Studio--OpenEuler Training Notes (1)
How IP-Guard prohibits running U disk programs