c++ - 无法使用迭代器迭代具有数组类型的 GVariant

标签 c++ glib dbus gdbus

我正在尝试使用 GDBus 通过 DBus 调用远程方法。我的问题是方法调用成功,但方法的返回值(作为 GVariant 可用)包含一个数组作为其元素。当我尝试使用 GVariantIter 遍历它时,它会导致段错误。但是,如果我使用 g_variant_print() 将它打印到标准输出,它就会成功打印数据。我究竟做错了什么 ?指定的格式字符串是正确的,我已经使用 g_variant_get_type_string() 进行了检查。我的代码片段如下。

        GVariantIter* iter;
        gint16 res, mts, vlm;
        guint16 sid;
        char * sname ;
        GVariant* avail ;
        guint16 clsid;
        GVariant* retvalue = g_dbus_proxy_call_sync (proxy, 
                                    "Method", 
                                    "", //no parameters
                                    G_DBUS_CALL_FLAGS_NONE, 
                                    -1, 
                                    NULL, 
                                    &error 
                                  );

        g_variant_get(retvalue, "(na(qs(nn)nnq))",&res, &iter);
        while ( g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid, &sname, &avail, &mts, &vlm,  &clsid) )
        {
            // Operate on the variables
        }

最佳答案

如果我没记错的话,g_dbus_proxy_call_sync() 会在一个元组中返回你的 GVariant。您需要做的是在创建迭代器之前打开元组。

尝试在调用 g_dbus_proxy_call_sync 之后执行此操作:

GVariantIter *iter;
GVariant *temp;

temp = g_variant_get_child_value (retvalue, 0);

iter = g_variant_iter_new (temp);

while (g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid,
  &sname, &avail, &mts, &vlm,  &clsid)) 
{
  //operate
}

关于c++ - 无法使用迭代器迭代具有数组类型的 GVariant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131717/

相关文章:

C++ dll 变量到 vb.net exe

c++ - 如果未定义检查的 bool 宏,则生成错误

embedded-linux - 设备上没有剩余空间?

compilation - 使用新的 glib 版本编译 gstreamer

python - 如何获得我的应用程序的根权限?

c++ - 以下递归目录搜索和文件打开有什么问题?

c++ - 简单但频繁使用 std::stringstream 是否过早悲观?

c++ - 对向 ec2 linux 添加新 glib 版本的所有帖子感到困惑

python - 如何使用 python 持续监控 rhythmbox 的音轨变化

Golang API 到 WPA 请求方