我可以在没有实现D-Bus方法的应用程序启动并运行的情况下调用dbus_g_proxy_new_for_name吗? 我不确定这样做是好的做法,还是通常的。
答案 0 :(得分:5)
在我回答之前,我想指出 DBus-GLib is deprecated 。但是,答案适用于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 Activation Tutorial的“客户端实施”部分。它包括这个片段(注意评论):
/* 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激活,所以显然名称在此之前不一定存在。