【问题标题】:DBus Glib, send a signal with a struct nestedDBus Glib,发送带有嵌套结构的信号
【发布时间】:2011-09-21 22:46:15
【问题描述】:

我正在 linux 上开发一个使用 c++ 语言的应用程序。我想这样发送信号:

<signal name="EmitSignal">
    <arg type="(u(i)uussssu)" name="t_struct_of_signal" direction="out" />
</signal>

type="(u(i)uussssu)" 中的第二个参数是枚举类型。

我正在尝试注册一个结构

#define STRUCT_OF_SIGNAL (dbus_g_type_get_struct ("GValueArray", \
                         G_TYPE_UINT, \
                         G_TYPE_POINTER, \ 
                         G_TYPE_UINT, \
                         G_TYPE_UINT, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_STRING, \
                         G_TYPE_UINT, \
                         G_TYPE_INVALID))

但我有一些错误:

** (process:21792): WARNING **: No marshaller registered for type "gpointer"
** (process:21792): WARNING **: failed to marshal parameter 1 for signal EmitSignal

有人可以帮我吗?

非常感谢

【问题讨论】:

    标签: c++ send signals glib dbus


    【解决方案1】:

    我解决了:我把G_TYPE_VALUE_ARRAY改成了dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID)

    然后,这是:

    g_value_init(g_value_array_get_nth(ret, 0), G_TYPE_VALUE_ARRAY);
    

    现在是:

    g_value_init(g_value_array_get_nth(ret, 0), dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID));
    

    G_TYPE_VALUE_ARRAYGValueArray 结构可能不兼容。

    【讨论】:

      【解决方案2】:

      我解决了第一个问题:

      #define STRUCT_OF_SIGNAL (dbus_g_type_get_struct ("GValueArray", \
                G_TYPE_UINT,\
                dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_INVALID), \
                G_TYPE_UINT,\
                G_TYPE_UINT,\
                G_TYPE_STRING,\
                G_TYPE_STRING,\
                G_TYPE_STRING,\
                G_TYPE_STRING,\
                G_TYPE_UINT,\
                G_TYPE_INVALID))
      

      信号接口现在是正确的,但是当我调用 g_signal_emit 时:

      (process:11052): GLib-GObject-CRITICAL **: g_value_copy: assertion `g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value))' failed
      
      (process:11052): GLib-GObject-CRITICAL **: g_value_array_get_nth: assertion `value_array != NULL' failed
      
      (process:11052): GLib-GObject-CRITICAL **: g_value_copy: assertion `G_IS_VALUE (src_value)' failed
      

      我初始化第二个参数:

      g_value_array_prepend(ret, NULL);
      g_value_init(g_value_array_get_nth(ret, 0), G_TYPE_VALUE_ARRAY);
      
      GValueArray *l_class = g_value_array_new(1);
      g_value_array_prepend(l_class, NULL);
      g_value_init(g_value_array_get_nth(l_class, 0), G_TYPE_UINT);
      g_value_set_uint(g_value_array_get_nth(l_class, 0), obj->class_id);
      
      g_value_set_boxed(g_value_array_get_nth(ret, 0), l_class);
      

      【讨论】:

        猜你喜欢
        • 2011-01-08
        • 2014-03-27
        • 1970-01-01
        • 2015-08-21
        • 2012-01-28
        • 1970-01-01
        • 2023-03-10
        • 2017-04-20
        • 1970-01-01
        相关资源
        最近更新 更多