【问题标题】:getting results from g_varient_new () ...从 g_variant_new () 获取结果 ...
【发布时间】:2016-03-25 07:15:04
【问题描述】:

我正在学习如何使用这个 g_varient_new(),这真的让我很困惑。我读过https://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-new,但我不能轻易理解。

我有一个代码:

#define MM_DBUS_SERVICE "org.freedesktop.ModemManager1"
#define MM_DBUS_PATH "/org/freedesktop/ModemManager1/Modem/0"
#define MM_DBUS_GET_PROPERTIES  "org.freedesktop.DBus.Properties"
....

int i;
    GError *error = NULL;
    GVariant *ret;
    char **paths;
    ret = g_dbus_proxy_call_sync (proxy,
                          "org.freedesktop.DBus.Properties.Get",
                          g_variant_new ("(ss)",
                                      "org.freedesktop.ModemManager1.Modem",
                                      "SignalQuality"),
                          G_DBUS_CALL_FLAGS_NONE, -1,
                          NULL, &error);

    if (!ret) {
            g_dbus_error_strip_remote_error (error);
            g_print ("failed: %s\n", error->message);
            g_error_free (error);
            return;
    }

    g_variant_get (ret, "(v)", &paths);
    g_variant_unref (ret);

    for (i = 0; paths[i]; i++) {
            g_print ("Printing \n");
            g_print ("%s\n", paths[i]);
    }
    g_strfreev (paths);

它编译得很好,但是当它运行时我得到了 seg_fault。 测试 打印

印刷 分段错误

我期望从这个调用中得到的结果是:

dbus-send --system --print-reply --dest=org.freedesktop.ModemManager1 "/org/freedesktop/ModemManager1/Modem/0" org.freedesktop.DBus.Properties.Get string:org.freedesktop.ModemManager1.Modem string:"SignalQuality"

method return sender=:1.1 -> dest=:1.121 reply_serial=2
   variant       struct {
       uint32 38
       boolean true
   }

如何从调用中获取变体数据结构和其中的数据?我应该如何形成 g_variat_new() 调用来完成这个?

谢谢

【问题讨论】:

    标签: c gdbus


    【解决方案1】:

    我认为,首先你需要解构元组:

    GVariant *inner;
    g_variant_get (ret, "(v)", &inner);
    

    然后分解一个元组:

    guint32 num;
    gboolean b;
    
    g_variant_get (inner, "(ub)", &num, &b);
    

    查看this

    您还可以使用函数g_variant_get_type_string(parameters)g_variant_is_of_type (parameters, G_VARIANT_TYPE (type_string))。第一个有利于调试和找出数据格式,即格式字符串,第二个是预防措施,如果 DBus API 将来发生更改,而不是崩溃,您可以生成有意义的 g_warning() 并采取操作(例如,从函数返回一些错误)。

    【讨论】:

    • 谢谢!!我仍然得到这个:(process:4434): GLib-CRITICAL **: ub' is not a valid GVariant format string (process:4434): GLib-CRITICAL **: g_variant_get: assertion valid_format_string (format_string, TRUE, value)' failed Segmentation fault
    • @Ali 嗯,你能打印然后 g_variant_get_type_string(inner) 吗?
    • 嗯,是的,我已经添加了括号......但我仍然得到......(进程:4565):GLib-CRITICAL **:g_variant_get_va:断言`value!= NULL'失败跨度>
    • 是的,我也已经完成了 gboolean 校正,但仍然错误:-)
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多