DBus Glib,发送带有嵌套结构的信号
Posted
技术标签:
【中文标题】DBus Glib,发送带有嵌套结构的信号【英文标题】:DBus Glib, send a signal with a struct nested 【发布时间】: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
有人可以帮我吗?
非常感谢
【问题讨论】:
【参考方案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_ARRAY
和 GValueArray
结构可能不兼容。
【讨论】:
【参考方案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);
【讨论】:
以上是关于DBus Glib,发送带有嵌套结构的信号的主要内容,如果未能解决你的问题,请参考以下文章
在 glib dbus 中正确使用 GPtrArray 和 GValueArray
dbus-glib.h里面没有DBusConnection,只有DBusGConnection。
linux 进程间通信 dbus-glib实例详解三(下) 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象object) 等 )(附代码)