ToB企服应用市场:ToB评测及商务社交产业平台

标题: DBus 在Qt和C++中的利用Demo [打印本页]

作者: 郭卫东    时间: 2024-6-19 21:09
标题: DBus 在Qt和C++中的利用Demo
一、DBus
DBus(D-Bus)是一种跨历程通讯机制,是一种消息总线体系。DBus提供了一种在应用程序之间进行通讯和交互的方式,可以在不同的历程之间传递消息,并提供了一套API供开发者利用。


二、Qt中利用
功能:先获取当前用户的路径,在根据路径,通过属性获取用户的昵称。
   在 .pro 文件中添加 QtDBus 模块:
QT += core gui dbus
    QDBusInterface 参数:
  
  1. #include <QtDBus/QDBusInterface>
  2. #include <QtDBus/QDBusReply>
  3. QString getUserPath()
  4. {
  5.         QString userName = qgetenv("USER");
  6.         const char* server = "org.freedesktop.Accounts";
  7.         const char* path = "/org/freedesktop/Accounts";
  8.         const char* interface = "org.freedesktop.Accounts";
  9.         QDBusInterface dbusInterface(server, path, interface, QDBusConnection::systemBus());
  10.         // 参数指定调用的方法,以及方法的参数
  11.         QDBusReply<QDBusObjectPath> reply = dbusInterface.call("FindUserByName", userName);
  12.         return reply.error().type() == QDBusError::NoError ? reply.value().path() : "";
  13. }
  14. void getNickName(const QString &userPath)
  15. {
  16.         const char* server = "org.freedesktop.Accounts";
  17.         const char* path = userPath.toLatin1().data();
  18.         const char* interface = "org.freedesktop.Accounts.User";
  19.         QDBusInterface dbusInterfaceTwo(server, path, interface, QDBusConnection::systemBus());  
  20.         QString nickName = dbusInterfaceTwo.property("RealName").toString();
  21.         qDebug() << "NickName:" << nickName;
  22. }
  23. int main()
  24. {
  25.         getNickName(getUserPath());
  26.         return 0;
  27. }
复制代码


三、C++中利用
实现上述同样的功能。
   
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dbus-1.0/dbus/dbus.h>
  4. DBusConnection *getDBusConnect()
  5. {
  6.     DBusError error;
  7.     dbus_error_init(&error);
  8.     DBusConnection *connect = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
  9.     if (dbus_error_is_set(&error)) {
  10.         fprintf(stderr, "Error connecting to system bus: %s\n", error.message);
  11.         dbus_error_free(&error);
  12.         return NULL;
  13.     }
  14.     return connect;
  15. }
  16.   
  17. void call_find_user_by_name(DBusConnection *connect, char **userPath) {
  18.     DBusMessage *message = dbus_message_new_method_call(
  19.         "org.freedesktop.Accounts",
  20.         "/org/freedesktop/Accounts",  
  21.         "org.freedesktop.Accounts",  
  22.         "FindUserByName"  
  23.     );
  24.     const char *userName = getenv("USER");
  25.     dbus_message_append_args(message, DBUS_TYPE_STRING, &userName, DBUS_TYPE_INVALID);
  26.     DBusError error;
  27.     dbus_error_init(&error);
  28.     DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);
  29.     // Failed
  30.     if (dbus_error_is_set(&error)) {
  31.         fprintf(stderr, "Error: %s\n", error.message);
  32.         dbus_error_free(&error);
  33.         return;
  34.     }
  35.     // Success
  36.     dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, userPath, DBUS_TYPE_INVALID);
  37.    
  38.     if (message)
  39.         dbus_message_unref(message);  
  40.     if (reply)
  41.         dbus_message_unref(reply);  
  42. }  
  43. void call_real_name(DBusConnection *connect, char *userPath) {
  44.     DBusMessage *message = dbus_message_new_method_call(  
  45.         "org.freedesktop.Accounts",  
  46.         userPath,
  47.         "org.freedesktop.DBus.Properties",  
  48.         "Get"
  49.     );  
  50.     const char *interface = "org.freedesktop.Accounts.User";
  51.     const char *property = "RealName";
  52.     if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {  
  53.         fprintf(stderr, "Out of memory\n");
  54.         dbus_message_unref(message);
  55.         return;
  56.     }  
  57.       
  58.     DBusError error;
  59.     dbus_error_init(&error);
  60.     DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);
  61.       
  62.     if (dbus_error_is_set(&error)) {  
  63.         fprintf(stderr, "Error getting property: %s\n", error.message);  
  64.         dbus_error_free(&error);
  65.         return;
  66.     }
  67.     DBusMessageIter args;
  68.     if (dbus_message_iter_init(reply, &args) && dbus_message_iter_get_arg_type(&args) == DBUS_TYPE_VARIANT) {  
  69.         DBusMessageIter variant;  
  70.         dbus_message_iter_recurse(&args, &variant);  
  71.   
  72.         // VARIANT is a string
  73.         if (dbus_message_iter_get_arg_type(&variant) == DBUS_TYPE_STRING) {
  74.             char *nickName = NULL;
  75.             dbus_message_iter_get_basic(&variant, &nickName);
  76.             printf("Nickname: %s\n", nickName);
  77.         }
  78.     }  
  79.     if (message)
  80.         dbus_message_unref(message);
  81.     if (reply)
  82.         dbus_message_unref(reply);
  83. }
  84.   
  85. int main()
  86. {
  87.     DBusConnection *connect = getDBusConnect();
  88.     char *userPath = NULL;
  89.     call_find_user_by_name(connect, &userPath);  // 二级指针:可以用来返回多个值,作为输出型参数
  90.     call_real_name(connect, userPath);
  91.     dbus_connection_unref(connect);
  92.     return 0;  
  93. }  
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4