尽管存在方法,但在对象路径中找不到 D-Bus 方法
Posted
技术标签:
【中文标题】尽管存在方法,但在对象路径中找不到 D-Bus 方法【英文标题】:D-Bus method not found at object path despite the fact that method exist 【发布时间】:2016-08-21 11:46:08 【问题描述】:我用这个 com.example.appname.desktop 文件实现了一个应用程序,如下所示:
$ cat /usr/local/share/applications/com.example.appname.desktop
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=appname
Exec=/opt/app/appname %u
DBusActivatable=true
Categories=Network;
MimeType=x-scheme-handler/itmm;
NoDisplay=false
$ cat /usr/share/dbus-1/services/com.example.appname.service
[D-BUS Service]
Name=com.example.appname
Exec=/opt/app/appname
自省 XML 如下所示:
$ qdbus com.example.appname /com/example/appname org.freedesktop.DBus.Introspectable.Introspect
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.Application">
<method name="ActivateAction">
<arg name="action_name" type="s" direction="in"/>
<arg name="parameter" type="av" direction="in"/>
<arg name="platform_data" type="asv" direction="in"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QVariantMap"/>
</method>
<method name="Activate">
<arg name="platform_data" type="asv" direction="in"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
</method>
<method name="Open">
<arg name="uris" type="as" direction="in"/>
<arg name="platform_data" type="asv" direction="in"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
</method>
</interface>
<interface name="org.freedesktop.DBus.Properties">
<method name="Get">
<arg name="interface_name" type="s" direction="in"/>
<arg name="property_name" type="s" direction="in"/>
<arg name="value" type="v" direction="out"/>
</method>
----<snipped>-----
但是当我尝试启动该方法时,它给了我一个错误:
$ gapplication launch com.example.appname
error sending Activate message to application: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such method 'Activate' in interface 'org.freedesktop.Application' at object path '/com/example/appname' (signature 'asv')
是“annotation name=..” XML 标签(参见 introspection XML)找不到这个方法的原因吗?
通过浏览器浏览到itmm://192.168.1.1/query?version=1.0
使用命令行参数启动应用程序,但它不是通过 D-Bus 服务启动的,这就是我的要求。有没有办法通过 firefox 或 google chrome 浏览器进行调试?
【问题讨论】:
【参考方案1】:我使用 QT 的 D-Bus 绑定来实现 D-Bus 服务。我的问题是
-
我的实现 D-Bus 接口的类没有继承 QDBusAbstractAdaptor 。
要导出的方法未标记为
public slots
我原来的类如下所示:
class DBusService : public Application
QOBJECT
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application")
public:
void Activate(QMap<QString, QVariant> platform_data)
Q_UNUSED(platform_data);
void Open(QStringList uris, QMap<QString, QVariant> platform_data)
Q_UNUSED(platform_data);
if( ! uris.size() )
return;
QUrl url(uris[0]);
//use url
以下作品:
class DBusService : public QDBusAbstractAdaptor //<----- Inherit from this class
QOBJECT
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application")
public slots: // <------ mark public slots
void Activate(QMap<QString, QVariant> platform_data)
Q_UNUSED(platform_data);
void Open(QStringList uris, QMap<QString, QVariant> platform_data)
Q_UNUSED(platform_data);
if( ! uris.size() )
return;
QUrl url(uris[0]);
qApp->MyCustomMethod(url);
D-Bus 调试工具
这些工具帮助我调试 D-Bus 问题。 dbus-monitor - 嗅探总线上的流量gapplication - 让您调试DBusActivatable
服务。
【讨论】:
以上是关于尽管存在方法,但在对象路径中找不到 D-Bus 方法的主要内容,如果未能解决你的问题,请参考以下文章
SBT 在本地 maven 存储库中找不到文件,尽管它在那里
在 web-app 中找不到 Spring ContextLoaderListener 但在系统类路径中找到
适用于 blob 的 Azure Java SDK - 已请求加载默认 HttpClient 提供程序,但在类路径中找不到该提供程序
在提供的路径中找不到应用程序包...“:CFBundleIdentifier”,不存在