【问题标题】:How to use types generated by gdbus-codegen?如何使用 gdbus-codegen 生成的类型?
【发布时间】:2017-08-16 13:43:35
【问题描述】:

我正在实现一个 dbus 服务器,为了简化操作,我决定使用gdbus-codegen

This hello world exampleit's repository 将生成头文件和源文件。然后它将信号连接到函数:

g_signal_connect (interface, 
                  "handle-hello-world", 
                  G_CALLBACK (on_handle_hello_world), NULL);

接下来是我的问题:

  • 函数GType min_min_bus_gdbus_get_type (void) 应该做什么?它已声明,但未在生成的文件中定义。
  • 我可以使用在生成的标头中声明的struct MinMinBusGDBUSIface,而不是将信号连接到回调函数(如上所述)吗?

我在网上找到的任何示例都有这两个东西(*_get_type (void) 函数声明和struct *Iface 在生成的标头中声明。如何使用它们?

【问题讨论】:

  • 是的,C 是与 C++ 不同的语言。您想要 C C++ 的答案吗?
  • @Toby 我知道它们是不同的,但 C 和 C++ 的答案应该是相同的。

标签: c++ c gio gdbus


【解决方案1】:

在玩了这个例子之后,我终于弄清楚了答案,以及如何访问界面结构以及如何设置它。这是无处可寻的,也没有在任何地方记录。


查看生成的源文件后,GType min_min_bus_gdbus_get_type (void) 函数可能被定义在一个巨大的宏乱码中,但我不确定它的功能以及如何使用它。


有一种方法可以通过使用MIN_MIN_BUS_GDBUS_GET_IFACE 宏(同样在生成的标头中)来访问struct MinMinBusGDBUSIface

设置函数回调,示例中的这一行:

g_signal_connect (interface, 
                  "handle-hello-world", 
                  G_CALLBACK (on_handle_hello_world), NULL);

可以替换为:

MinMinBusGDBUSIface* iface = MIN_MIN_BUS_GDBUS_GET_IFACE(interface);
iface->handle_hello_world = &on_handle_hello_world;

并且必须将回调修改为与函数回调具有相同的签名:

static gboolean
on_handle_hello_world (MinMinBusGDBUS *interface, 
                       GDBusMethodInvocation *invocation,
                       const gchar *greeting)

【讨论】:

  • “这是无处可寻的,也没有在任何地方记录。”它记录在案:GObject 手册。这是一个标准的 GObject 类型定义,假设您使用gdbus-codegen,您已经阅读了如何使用 GObject。这是手册:developer.gnome.org/gobject/stable/index.html
  • @PhilipWithnall 谢谢。甚至没有一个例子可以证明这一点。都带有“g_signal_connect”
猜你喜欢
  • 2019-11-12
  • 2019-09-16
  • 2020-12-21
  • 2021-11-16
  • 2019-07-30
  • 1970-01-01
  • 2016-09-29
  • 2020-02-29
  • 2021-12-29
相关资源
最近更新 更多