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

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

写数据的进程:
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); }

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

你可能感兴趣的:(数据,mfc,共享内存,共享数据)