我可以在没有实现D-Bus方法的应用程序启动并运行的情况下调用dbus_g_proxy_new_for_name吗?我不确定这样做是否是好的做法,或者是否通常.
在我回答之前,我想指出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ëlSlinckx'DBusActivation 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;
}
Run Code Online (Sandbox Code Playgroud)
在调用方法之前,甚至不会触发D-Bus激活,因此显然该名称在此之前不一定存在.