在 DBus 中,方法调用的输出是通过参数列表传递的,而不是经典的 C 函数返回机制。此外,如果该方法不是异步的,则只允许返回单个真/假布尔结果(以经典 C 函数返回样式返回)。在您的反省中,您必须将此方法注释为异步,因为它返回多个字符串值。您的代理方法调用将传递指向两个字符串变量的指针以接收结果。
如果我以 dbus-glib 为例...
<method name="getLocalTime">
<arg type="s" name="timeString" direction="out" />
<arg type="s" name="dateString" direction="out" />
<annotate name="org.freedesktop.DBus.GLib.Async" />
</method>
然后在我实施该方法时...
void
dbus_service_get_local_time(
MyGObject* self,
DBusGMethodInvocation* context
)
{
char* timeString;
char* dateString;
// do stuff to create your two strings...
dbus_g_method_return( context, timeString, dateString );
// clean up allocated memory, etc...
}
从调用者的角度来看,代理方法调用看起来像这样......
gboolean
dbus_supplicant_get_local_time(
DBusProxy* proxy,
char* OUT_timeString,
char* OUT_dateString,
GError** error
);
请注意,在代理方法中,gboolean 结果是是否可以进行 D-Bus 调用,而不是调用方法的结果。