winApi与QtApi的共享内存通信

目的

就是A程序是QT的程序用的QT的接口读取共享内存,B程序是WinApi创建的共享内存,两个程序进行共享内存;
其间还有信号量,信号量,统一用的winApi的信号量。
就是下边这种情况:
在这里插入图片描述

下边的这个例子,就针对两块重点,进行分析:
1、QT侧的共享内存与win Api的共享内存如何共享,直接共享肯定会失败的。
2、共享内存的信号里怎么应用,才能解决,资源的冲突问题,资源的协调问题。

参考资料

https://www.cnblogs.com/lidabo/p/17222887.html

过程

内存挂载不上的问题

就是QT侧进程:

QSharedMemory sharedMemory;
sharedMemory.setKey(QString("memoryKeyForTest"));
用的这个共享内存的key,于是winApi侧的也用这一个key:
const char* shmName = "memoryKeyForTest";
    HANDLE hMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, shmName);
    if (hMapFile == NULL) {
   
   
        std::cerr << "CreateFileMapping failed with error " << GetLastError() << std::endl;
        return 1;
    }

    LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 4096);
    if (lpBase == NULL) {
   
   
        std::cerr << "MapViewOfFile failed with error " << GetLastError() << std::endl;
        CloseHandle(hMapFile);
        return 1;
    }

发现两个程序总是不能通信,怎么回事,调试跟踪QT代码,发现QT的共享内存总是挂载不上,就是这段代码执行总失败:

 if (!sharedMemory.isAttached())
    {
   
   
        if(!sharedMemory.attach())
        {
   
   
            qDebug("program exit!");
            return -1;
        }
    }

那是怎么回事,名字是一样的啊,于是,网上找资料,也没有相关明确的资料,有一个网上说:QT内部对key的名字进行了处理,那如何得到这一个名字呢?不至于,查QT 源码吧?
还是翻翻qt Api的帮助文档,果真有这么一段:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员如山石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值