做两个进程,一个进程把数据写到内存空间,一个进程从内存空间中读取数据.
写数据的进程
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);
}