gpt4 book ai didi

c++ - 尝试获取具有自定义类型的 DBus 属性时出现 fatal error

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:12 24 4
gpt4 key购买 nike

我正在尝试连接 UDisks2使用 Qt 应用程序,读取自定义属性会使程序崩溃。

对于 SMART 属性,一切正常(包括 custom properties ),但是当我尝试读取 RAID 设备属性时 ActiveDevices我收到 Qt fatal error 并且应用程序崩溃

以下是一个说明行为的测试程序:

#include <QApplication>

#include <QDBusMetaType>
#include <QDBusConnection>
#include <QDBusInterface>

#include <QDebug>


//create the structure as defined in
// http://udisks.freedesktop.org/docs/latest/gdbus-org.freedesktop.UDisks2.MDRaid.html#gdbus-property-org-freedesktop-UDisks2-MDRaid.ActiveDevices
struct MDRaidMember {
QDBusObjectPath block;
qint32 slot;
QStringList state;
qint64 numReadErrors;
QVariantMap expansion;
};
Q_DECLARE_METATYPE(MDRaidMember)


//marshalling operator
QDBusArgument &operator<<(QDBusArgument &argument, const MDRaidMember& raidMember)
{
argument.beginStructure();
argument << raidMember.block;
argument << raidMember.slot;
argument << raidMember.state;
argument << raidMember.numReadErrors;
argument << raidMember.expansion;
argument.endStructure();
return argument;
}


//unmarshall operator
const QDBusArgument &operator>>(const QDBusArgument &argument, MDRaidMember& raidMember)
{
argument.beginStructure();
argument >> raidMember.block;
argument >> raidMember.slot;
argument >> raidMember.state;
argument >> raidMember.numReadErrors;
argument >> raidMember.expansion;
argument.endStructure();
return argument;
}



int main(int argc, char *argv[]) {
QApplication app(argc, argv);

//register the type, everything looks fine
qDebug() << qRegisterMetaType<MDRaidMember>("MDRaidMember");
qDebug() << qDBusRegisterMetaType<MDRaidMember>();


QDBusInterface iface("org.freedesktop.UDisks2",
"/org/freedesktop/UDisks2/mdraid/9aec6784_86ec37d4_8c1c6add_4dc9fe81",
"org.freedesktop.UDisks2.MDRaid",
QDBusConnection::systemBus());

//read some properties
qDebug() << iface.property("UUID");
qDebug() << iface.property("ActiveDevices"); //crash the test program!

return app.exec();
}

执行这段代码会产生以下输出

1057
1057
QVariant(QString, "9aec6784:86ec37d4:8c1c6add:4dc9fe81")
Cannot construct placeholder type QDBusRawType
zsh: abort (core dumped) ./app/test_members

有人遇到过这种情况吗?我认为它与我的代码完全无关,因为如果未声明自定义类型(仅保留 main 函数的内容),结果是相同的。

最佳答案

我没有找到正确的答案,但这里有一个解决方法:在接口(interface) org.freedesktop.DBus.Properties 上调用 Get 方法并解码结果手动。棘手的部分是计算结果的内容(它是一个 QVariant 包含一个 QDBusVariant 包含一个 QDBusArgument)

更新后的 main 函数:

//...

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

//register the type, everything looks fine
qDebug() << qRegisterMetaType<MDRaidMember>("MDRaidMember");
qDebug() << qDBusRegisterMetaType<MDRaidMember>();


QDBusInterface iface("org.freedesktop.UDisks2",
"/org/freedesktop/UDisks2/mdraid/9aec6784_86ec37d4_8c1c6add_4dc9fe81",
"org.freedesktop.DBus.Properties",
QDBusConnection::systemBus());

QDBusMessage reply = iface.call("Get", "org.freedesktop.UDisks2.MDRaid", "ActiveDevices");
QVariant v = reply.arguments().first();
QDBusArgument arg = v.value<QDBusVariant>().variant().value<QDBusArgument>();

QList<MDRaidMember> members;
arg.beginArray();
while(!arg.atEnd()) {
MDRaidMember m;
arg >> m;
members << m;
}

qDebug() << members;

return app.exec();
}

关于c++ - 尝试获取具有自定义类型的 DBus 属性时出现 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com