共享内存结构体数据(结构体不能使用指针)


struct MyStruct
{
    int a;
    int b;
    TCHAR name[20];
};

void CNewSoulDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    MyStruct Test;
    Test.a = 1;
    Test.b = 2;
    _tcscpy(Test.name, "三哥说:我不是猪");
    HANDLE m_hMapObject = CreateFileMapping(
        (HANDLE)0xffffffff, //因为不是读写文件,所以不需要文件句柄
        nullptr,            //默认安全属性
        PAGE_READWRITE,     //可读写
        0,                  //高32位不用
        0x1000,             //用低32位,大小为4k
        TEXT("ShareData")   //共享数据的名字
    );
    if (!m_hMapObject)
    {
        AfxMessageBox(TEXT("创建映射对象失败"));
    }
    //获取一块内存空间以便写入数据
    MyStruct  *m_pszMapView = (MyStruct*)MapViewOfFile(m_hMapObject, FILE_SHARE_WRITE, 0, 0, 0);
    if (!m_pszMapView)
    {
        AfxMessageBox(TEXT("映射数据失败"));
    }
    //lstrcpy(m_pszMapView, Test);
    memcpy(m_pszMapView,&Test, sizeof(Test));
}


void CNewSoulDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    MyStruct *str;

    HANDLE m_hMapObject;//映射对象句柄
    //打开映射对象
    m_hMapObject = OpenFileMapping(
        FILE_MAP_READ,   //可读映射
        FALSE,           //不被继承
        TEXT("ShareData")//共享数据的名称
    );
    if (!m_hMapObject)
    {
        AfxMessageBox(TEXT("打开映射失败"));
    }
    //读取共享数据,只要得到这块共享内存的地址,只要里面的数据发生改变,m_pszMapView也会跟着改变
    MyStruct  *m_pszMapView = (MyStruct*)MapViewOfFile(m_hMapObject, FILE_SHARE_READ, 0, 0, 0);
    str = m_pszMapView;
    if (!m_pszMapView)
    {
        AfxMessageBox(TEXT("读取映射数据失败"));
    }
    CString sor;
    sor.Format("%d %d %s", str->a, str->b,str->name);
    AfxMessageBox(sor);
    UnmapViewOfFile(m_pszMapView);
    CloseHandle(m_hMapObject);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值