DBus-Glib,发送一个带有嵌套结构的信号

DBus Glib, send a signal with a struct nested

本文关键字:嵌套 结构 信号 一个 DBus-Glib      更新时间:2023-10-16

我正在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

有人能帮我吗?

非常感谢

我解决了它:我将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结构可能不兼容。

我解决了第一个问题:

#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);