0

我创建了一个 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 程序中读取共享内存数据。谢谢你。

4

1 回答 1

0

来自 Qt 文档:

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

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

于 2013-05-14T15:37:53.590 回答