当前位置: 首页 > news >正文

DBus 在Qt和C++中的使用Demo

一、DBus
DBus(D-Bus)是一种跨进程通信机制,是一种消息总线系统。DBus提供了一种在应用程序之间进行通信和交互的方式,可以在不同的进程之间传递消息,并提供了一套API供开发者使用。



二、Qt中使用
功能:先获取当前用户的路径,在根据路径,通过属性获取用户的昵称。

在 .pro 文件中添加 QtDBus 模块:
QT += core gui dbus

QDBusInterface 参数:

  • D-Bus 服务的名称
  • DBus接口的对象路径
  • 接口名称(一个对象可以实现多个接口,每个接口提供不同的功能)
  • 指定使用哪个 D-Bus 总线进行通信,系统总线是全局的,所有用户和服务都可以访问,而会话总线则特定于每个用户会话。
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusReply>QString getUserPath()
{QString userName = qgetenv("USER");const char* server = "org.freedesktop.Accounts";const char* path = "/org/freedesktop/Accounts";const char* interface = "org.freedesktop.Accounts";QDBusInterface dbusInterface(server, path, interface, QDBusConnection::systemBus());// 参数指定调用的方法,以及方法的参数QDBusReply<QDBusObjectPath> reply = dbusInterface.call("FindUserByName", userName);return reply.error().type() == QDBusError::NoError ? reply.value().path() : "";
}void getNickName(const QString &userPath)
{const char* server = "org.freedesktop.Accounts";const char* path = userPath.toLatin1().data();const char* interface = "org.freedesktop.Accounts.User";QDBusInterface dbusInterfaceTwo(server, path, interface, QDBusConnection::systemBus());  QString nickName = dbusInterfaceTwo.property("RealName").toString();qDebug() << "NickName:" << nickName;
}int main()
{getNickName(getUserPath());return 0;
}


三、C++中使用
实现上述同样的功能。

  • 安装DBus
    sudo apt-get install libdbus-1-dev
  • 编译(头文件大写i,链接库小写L)
    gcc two.c -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ -ldbus-1
  • 执行
    ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <dbus-1.0/dbus/dbus.h>DBusConnection *getDBusConnect()
{DBusError error;dbus_error_init(&error);DBusConnection *connect = dbus_bus_get(DBUS_BUS_SYSTEM, &error);if (dbus_error_is_set(&error)) {fprintf(stderr, "Error connecting to system bus: %s\n", error.message);dbus_error_free(&error);return NULL;}return connect;
}void call_find_user_by_name(DBusConnection *connect, char **userPath) {DBusMessage *message = dbus_message_new_method_call("org.freedesktop.Accounts","/org/freedesktop/Accounts",  "org.freedesktop.Accounts",  "FindUserByName"  );const char *userName = getenv("USER");dbus_message_append_args(message, DBUS_TYPE_STRING, &userName, DBUS_TYPE_INVALID);DBusError error;dbus_error_init(&error);DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);// Failedif (dbus_error_is_set(&error)) {fprintf(stderr, "Error: %s\n", error.message);dbus_error_free(&error);return;}// Successdbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, userPath, DBUS_TYPE_INVALID);if (message)dbus_message_unref(message);  if (reply)dbus_message_unref(reply);  
}  void call_real_name(DBusConnection *connect, char *userPath) { DBusMessage *message = dbus_message_new_method_call(  "org.freedesktop.Accounts",  userPath,"org.freedesktop.DBus.Properties",  "Get");  const char *interface = "org.freedesktop.Accounts.User";const char *property = "RealName";if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {  fprintf(stderr, "Out of memory\n");dbus_message_unref(message);return;}  DBusError error;dbus_error_init(&error);DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);if (dbus_error_is_set(&error)) {  fprintf(stderr, "Error getting property: %s\n", error.message);  dbus_error_free(&error);return;}DBusMessageIter args;if (dbus_message_iter_init(reply, &args) && dbus_message_iter_get_arg_type(&args) == DBUS_TYPE_VARIANT) {  DBusMessageIter variant;  dbus_message_iter_recurse(&args, &variant);  // VARIANT is a stringif (dbus_message_iter_get_arg_type(&variant) == DBUS_TYPE_STRING) {char *nickName = NULL;dbus_message_iter_get_basic(&variant, &nickName);printf("Nickname: %s\n", nickName);} }  if (message)dbus_message_unref(message);if (reply)dbus_message_unref(reply);
}int main()
{DBusConnection *connect = getDBusConnect();char *userPath = NULL;call_find_user_by_name(connect, &userPath);  // 二级指针:可以用来返回多个值call_real_name(connect, userPath);dbus_connection_unref(connect);return 0;  
}  

相关文章:

  • [Cesium学习]
  • react高阶组件——withRouter
  • FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
  • chatgpt之api的调用问题
  • 【redis】set和zset常用命令
  • JavaScript 贪心算法(Greedy Algo)
  • 数据库索引的理解
  • Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用
  • Python实用代码片段分享(三)
  • Python3 函数参数
  • tongweb7049m1升级到tongweb7049m3,启动 报错:realm can not be null(by jjz+yjm+lqw)
  • 开窗函数!
  • Android实现无线连接ADB调试
  • STM32学习和实践笔记(33):待机唤醒实验
  • 操作系统 - 文件管理
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017届校招提前批面试回顾
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • angular2开源库收集
  • Druid 在有赞的实践
  • gcc介绍及安装
  • iOS | NSProxy
  • Making An Indicator With Pure CSS
  • maven工程打包jar以及java jar命令的classpath使用
  • mysql 5.6 原生Online DDL解析
  • Otto开发初探——微服务依赖管理新利器
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 高程读书笔记 第六章 面向对象程序设计
  • 给github项目添加CI badge
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 聊聊sentinel的DegradeSlot
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 数据可视化之 Sankey 桑基图的实现
  • 异常机制详解
  • 优化 Vue 项目编译文件大小
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 积累各种好的链接
  • ​Java并发新构件之Exchanger
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三)终结任务
  • (十一)手动添加用户和文件的特殊权限
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (原创)可支持最大高度的NestedScrollView
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .gitignore不生效的解决方案
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net接口调试与案例