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;  
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apple - Image I/O Programming Guide

翻译自&#xff1a;Image I/O Programming Guide&#xff08;更新时间&#xff1a;2016-09-13 https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/ImageIOGuide/imageio_intro/ikpg_intro.html#//apple_ref/doc/uid/TP40005462 文章目录 …

orbslam2代码解读(1):数据预处理过程

写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam&#xff0c;因为之前主要是做激光slam&#xff0c;有一定基础所以学的也比较快&#xff0c;也是看完了视觉14讲的后端后直接看orbslam2的课&#xff0c;看的cvlife的课&#xff08;课里大部分是代码…

jenkins的简单使用

2.1.简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 2.4.Jenkins安装 1.下载安装包jenkins.war&#xff1b; 2.在安装…

笔记 | 软件工程04:软件项目管理

1 软件项目及其特点 1.1 什么是项目 1.2 项目特点 1.3 影响项目成功的因素 1.4 什么是软件项目 针对软件这一特定产品和服务的项目努力开展“软件开发活动",&#xff08;理解&#xff1a;软件项目是一种活动&#xff09; 1.5 软件项目的特点 1.6 军用软件项目的特点 2 …

一、搭建 Vue3 Admin 项目:从无到有的精彩历程

在前端开发的领域中&#xff0c;Vue3 展现出了强大的魅力&#xff0c;而搭建一个功能丰富的 Vue3 Admin 项目更是充满挑战与乐趣。今天&#xff0c;我将和大家分享我搭建 Vue3 Admin 项目的详细过程&#xff0c;其中用到了一系列重要的依赖包。 首先 让我们开启这个旅程。在确…

怎么用电脑把图片转换二维码?图片在线生成二维码的步骤内容

现在很多人会通过二维码来存储物品的信息图片&#xff0c;其他人可以通过扫描二维码的方式来查看对应的图片内容&#xff0c;那么当我们需要将一批图片每个单独生成二维码&#xff0c;该如何操作能够快速将图片转换二维码呢&#xff1f; 今天&#xff0c;小编来分享给大家一个…

CNN卷积神经网络

一、概述 卷积神经网络&#xff08;CNN&#xff09;是深度学习领域的重要算法&#xff0c;特别适用于处理具有网格结构的数据&#xff0c;比如说图像和音频。它起源于二十世纪80至90年代&#xff0c;但真正得到快速发展和应用是在二十一世纪&#xff0c;随着深度学习理论的兴起…

【ai】phc:安装issac环境且fix libstdc++.so 版本报错

Pycharm远程连接服务器(2023-11-9) 大神分享了pycharm远程连接ubuntu工作站的方法。 https://github.com/ZhengyiLuo/PHC 给出的操作同样适用: 参考 Pycharm远程连接服务器(2023-11-9) :前提是一样的 PHC的要求:isaac 创建 conda activate isaac

前端js 元素拖拽案例

js原生元素拖拽案例 下面是一个简单的使用原生 JavaScript 实现元素拖拽的代码示例&#xff1a; <!DOCTYPE html> <html> <head><style>.draggable {width: 100px;height: 100px;background-color: red;position: absolute;cursor: move;}</style&…

【Vue】scoped解决样式冲突

默认情况下写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 全局样式: 默认组件中的样式会作用到全局&#xff0c;任何一个组件中都会受到此样式的影响 局部样式: 可以给组件加上scoped 属性,可以让样式只作用于当前组件 一、代码示例 BaseOne…

【springbootneo4j】版本差异对比

Spring官方提供的指南&#xff0c;包含如何使用Spring Data Neo4j构建应用程序的入门教程 本文旨在向读者介绍Spring Data Neo4j的旧版本&#xff08;主要使用Neo4j OGM&#xff09;和新版本&#xff08;最新的Spring Data Neo4j&#xff09;之间的主要差异。我们将重点讨论注解…

RocketMQ可视化界面安装

RocketMQ可视化界面安装 **起因&#xff1a;**访问rocketmq-externals项目的git地址&#xff0c;下载了源码&#xff0c;在目录中并没有找到rocketmq-console文件夹。 git下面文档提示rocketMQ的仪表板转移到了新的项目中&#xff0c;点击仪表板到新项目地址&#xff1b; 下载…

需求分析步骤

需求工程 1.需求获取 1.1系统分析人员与用户交流 1.2对现有系统的观察 1.3对任务进行分析确定系统或产品范围的限制性描述 1.4与系统或产品有关的人员及特征列表 1.5系统的技术环境描述 1.6系统功能的列表及应用于每个需求的领域限制 1.7一组描述不同运行条件下系统或产品使用…

vuex 快速入门

1.是什么 Vuex 是一个 Vue 的 状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如&#xff1a;购物车数据 个人信息数 2 .核心概念 - state 状态 State提供唯一的公共数据源&a…

搜索与图论:宽度优先搜索

搜索与图论&#xff1a;宽度优先搜索 题目描述参考代码 题目描述 输入样例 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0输出样例 8参考代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std;const int N …

VsQt单元测试目录的管理方式

正常项目的文件管理方式 正常项目的目录&#xff0c;是由文件系统中实际的文件夹进行分类管理的。 但是如果单元测试用实际文件夹管理的话&#xff0c;会出现问题&#xff0c;就是被测类太多了&#xff0c;用文件系统管理的话&#xff0c;不太方面查看&#xff0c;如下图所示。…

contentType 与 dataType

contentType 与 dataType contentType contentType&#xff1a;发送的数据格式&#xff08;请求方发送给服务器的数据格式&#xff09;&#xff0c;这个内容会放在请求方的 请求头中 application/x-www-form-urlencoded 这个是默认的请求格式。 提交给后台的数据会按照 KV&am…

创新实训2024.06.06日志:部署web服务

1. 运行web项目前后端服务 首先我们要先在服务器上运行客户端以及服务端的应用程序。随后再考虑如何通过公网/局域网访问的问题。 如何启动服务在仓库对应分支下的Readme文件中已经有详细描述了。 1.1. 启动服务端 对于服务端&#xff0c;即&#xff08;要求你在服务端子项…

SCARA机器人中旋转花键的维护和保养方法!

作为精密传动元件的一种&#xff0c;旋转花键在工作过程中承受了较大的负荷。在自动化设备上运用广泛&#xff0c;如&#xff1a;水平多关节机械手臂&#xff08;SCARA&#xff09;、产业用机器人、自动装载机、雷射加工机、搬运装置、机械加工中心的ATC装置等&#xff0c;最适…

MySQL在某些情况下不使用索引

当然&#xff0c;以下是您提供的内容转换成Markdown格式&#xff1a; 数据量太小&#xff1a;当表中的数据量非常少时&#xff0c;全表扫描可能比使用索引查找更快&#xff0c;因为索引的额外维护和查找成本可能超过直接扫描表的成本。 索引选择性低&#xff1a;如果索引列的值…