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

来源:互联网 发布:马桶推荐 知乎 编辑:程序博客网 时间:2024/05/18 02:02

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

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

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

0 0
原创粉丝点击