1

在文件DBUS中,XML如果我给出下面的代码,为什么会proxy生成一个void返回类型的函数?

    <method name="getLocalTime">
        <arg type="s" name="timeString" direction="out" />
        <arg type="s" name="dateString" direction="out" />
    </method>


virtual void getMyTime(std::string& time, std::string& date) = 0;
4

1 回答 1

2

在 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 调用,而不是调用方法的结果。

于 2013-03-23T14:31:28.987 回答