无法使用Qt创建的提升读取共享内存数据

时间:2013-05-14 14:31:38

标签: qt boost shared-memory

我已经创建了一个Qt共享内存程序来将字符串写入共享内存。现在写完之后,我需要从Boost程序中读取它。我尝试使用简单的程序,但我无法使用Boost进程读取字符串。

这是写入共享内存的Qt代码。我正在仔细检查字符串是否是从同一程序的共享内存中读取的。

void CDialog::loadString()
{
    if(sharedMemory.isAttached())
    {
        if(!sharedMemory.detach())
        {
            lbl->setText("Unable to detach from Shared Memory");
            return;
        }
    }

    lbl->setText("Click on Top Button");

    char sString[] = "my string";

    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);

    QDataStream out(&buffer);
    out << sString;

    int size = buffer.size();
    qDebug() << size;

    if(!sharedMemory.create(size))
    {
        lbl->setText("Unable to create shared memory segment");
        qDebug() << lbl->text();
    }
    sharedMemory.lock();
    char *to = (char *) sharedMemory.data();
    const char *from = buffer.data();
    memcpy(to, from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();

    char * str;
    QDataStream in(&buffer);
    sharedMemory.lock();
    buffer.setData((char *)sharedMemory.constData(), sharedMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> str;
    sharedMemory.unlock();
    qDebug() << str;
}

我正在使用我在Qt程序中提供的相同密钥从boost读取它。 以下是Boost程序代码 -

int main()
{
  boost::interprocess::shared_memory_object shdmem(boost::interprocess::open_only, "Highscore", boost::interprocess::read_only);

  boost::interprocess::offset_t size; 
  if (shdmem.get_size(size)) 
    std::cout << "Shared Mem Size: " << size << std::endl; 

  boost::interprocess::mapped_region region2(shdmem, boost::interprocess::read_only); 
  char *i2 = static_cast<char *>(region2.get_address()); 
  std::cout << i2 << std::endl;
  return 0;
}

请帮助我阅读Boost程序的共享内存数据。 谢谢。

1 个答案:

答案 0 :(得分:0)

来自Qt docs:

  

警告:QSharedMemory以特定于Qt的方式更改密钥。因此,目前无法将非Qt应用程序的共享内存与QSharedMemory一起使用。

你可能需要在双方都使用Boost。