3

我可以在没有实现 D-Bus 方法的应用程序启动并运行的情况下调用 dbus_g_proxy_new_for_name 吗?我不确定这样做是否是好的做法,或者是否是通常的做法。

4

1 回答 1

5

在我回答之前,我想指出DBus-GLib 已弃用。但是,答案也适用于g_dbus_proxy_new(它基本上是dbus_g_proxy_new_for_name的替代品)。

是的。dbus_g_proxy_new_for_name讨论了所有者如何随时间变化,尽管它没有明确提到调用时没有所有者的情况(最初强调):

名称所有者可能会随着时间而改变,例如在两个不同的方法调用之间,除非名称是唯一的名称。如果需要固定所有者,则需要请求当前所有者并将代理绑定到其唯一名称而不是通用名称;参见 dbus_g_proxy_new_for_name_owner()。

将其与 D-Bus 激活一起使用实际上很常见。查看Raphaël Slinckx 的 DBus 激活教程的“客户端实现”部分。它包括这个片段(注意评论):

/* This won't trigger activation! */
proxy = dbus_g_proxy_new_for_name (connection,
        "org.gnome.ServiceName",
        "/org/gnome/ServiceName",
        "org.gnome.ServiceName");

/* The method call will trigger activation, more on that later */
if (!org_gnome_ServiceName_echo_string (proxy, "The string we want echo-ed", &result, &error))
{
    /* Method failed, the GError is set, let's warn everyone */
    g_warning ("Woops remote method failed: %s", error->message);
    g_error_free (error);
    return;
}

D-Bus 激活甚至在调用方法之后才被触发,因此显然该名称在此之前不一定存在。

于 2013-02-09T01:10:07.057 回答