MFC-内存映射实现数据共享

本文介绍了使用MFC进行跨进程数据共享的方法,通过内存映射技术,一个进程写入数据,另一个进程则可以读取。详细步骤包括在写入进程中的数据定义、内存空间获取及数据写入,在读取进程中的映射对象打开、共享数据读取及定时显示。这种方法也可应用于大文件的跨进程读取。
摘要由CSDN通过智能技术生成

==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


做两个进程,一个进程把数据写到内存空间,一个进程从内存空间中读取数据.

写数据的进程:
1.定义两个成员变量

    HANDLE m_hMapObject;//映射对象句柄
	LPTSTR m_pszMapView;//指向映射的地址空间

2.在初始化对话框中获取一块内存空间以便写入

//创建映射对象
	m_hMapObject = CreateFileMapping(
		(HANDLE)0xffffffff, //因为不是读写文件,所以不需要文件句柄
		nullptr,			//默认安全属性
		PAGE_READWRITE, 	//可读写
		0,					//高32位不用
		0x1000,				//用低32位,大小为4k
		TEXT("ShareData")	//共享数据的名字
		);
    if (!m_hMapObject)
    {
		AfxMessageBox(TEXT("创建映射对象失败"));
		return FALSE;
    }
	//获取一块内存空间以便写入数据
	m_pszMapView = (LPTSTR)MapViewOfFile(m_hMapObject, FILE_SHARE_WRITE, 0, 0, 0);
	if (!m_pszMapView)
	{
		AfxMessageBox(TEXT("映射数据失败"));
		return FALSE;
	}

3.写入数据

	//把编辑框的数据读到内存空间
	UpdateData();
	lstrcpy(m_pszMapView, m_send);

读取数据进程:
1.定义两个成员变量

    HANDLE m_hMapObject;//映射对象句柄
	LPTSTR	m_pszMapView;

2.在初始化对话框中打开映射对象,并获取共享数据的内存地址,然后定时显示获取的数据

	//打开映射对象
	m_hMapObject = OpenFileMapping(
		FILE_MAP_READ,   //可读映射
		FALSE, 			 //不被继承
		TEXT("ShareData")//共享数据的名称
		);
	if (!m_hMapObject)
	{
		AfxMessageBox(TEXT("打开映射失败"));
		return FALSE;
	}
	//读取共享数据,只要得到这块共享内存的地址,只要里面的数据发生改变,m_pszMapView也会跟着改变
	m_pszMapView = (LPTSTR)MapViewOfFile(m_hMapObject, FILE_SHARE_READ, 0, 0, 0);
	if (!m_pszMapView)
	{
		AfxMessageBox(TEXT("读取映射数据失败"));
		return FALSE;
	}

	//设置一个定时器,一定间隔时间显示所接收的数据
	SetTimer(1, 50, nullptr);

3.在定时器函数中定时显示共享数据


void CMFCTEST1Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	SetDlgItemText(IDC_STATIC_RECV, m_pszMapView);

	CDialogEx::OnTimer(nIDEvent);
}

4.窗口销毁时关闭定时器

void CMFCTEST1Dlg::OnDestroy()
{
	CDialogEx::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	KillTimer(1);
}

同理,可以把一些大的文件放到共享内存中,然后给其它进程读取.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值