获取GVariant的内容

2024-01-07

我目前尝试与 dbus 通信并有一个函数,该函数将返回array of struct(string, uint32, string, string, object path)。我将结果存储在GVariant并打印这个GVariant显示那里有正确的结果值。

更具描述性:我尝试获取 Systemd 的 Logind Managers 的结果ListSessions.

打印的输出是:

[('2', uint32 1000, 'nidhoegger', 'seat0', objectpath
'/org/freedesktop/login1/session/_32'), ('6', 1001, 'test', 'seat0',
'/org/freedesktop/login1/session/_36'), ('c2', 111, 'lightdm',
'seat0', '/org/freedesktop/login1/session/c2')]

我现在正在尝试使用以下方法获取循环中的每个数组元素:

for (uint32_t i = 0; i < ::g_variant_n_children(v); ++i)
{
    GVariant *child = ::g_variant_get_child_value(v, i);
}

打印孩子时我得到:

<('2', uint32 1000, 'nidhoegger', 'seat0', objectpath '/org/freedesktop/login1/session/_32')>

到目前为止,一切都很好。现在我正在尝试使用单个项目g_variant_get这边走:

gchar *id = NULL;
uint32_t uid = 0;
gchar *user = NULL;
gchar *seat = NULL;
gchar *session_path = NULL;

::g_variant_get(v, "(susso)", &id, &uid, &user, &seat, &session_path);

但它只给了我这个断言:

(process:12712): GLib-CRITICAL **: the GVariant format string '(susso)' has a type of '(susso)' but the given value has a type of 'v'

(process:12712): GLib-CRITICAL **: g_variant_get_va: assertion 'valid_format_string (format_string, !endptr, value)' failed

如果这是相关的:我生成了与之通信的代码gdbus-codegen获取该值的函数具有以下签名:

gboolean login1_manager_call_list_sessions_sync (
    Login1Manager *proxy,
    GVariant **out_unnamed_arg0,
    GCancellable *cancellable,
    GError **error);

我究竟做错了什么?为什么它返回“v”作为值?


::g_variant_get(v, "(susso)", &id, &uid, &user, &seat, &session_path);

这看起来很可疑。你应该调用它child, not v.

以下 C 代码对我来说效果很好:

/* gcc `pkg-config --cflags --libs glib-2.0` -o test test.c */
#include <glib.h>

int
main (void)
{
  g_autoptr(GVariant) sessions = NULL;

  sessions = g_variant_new_parsed ("[('2', uint32 1000, 'nidhoegger', 'seat0', objectpath '/org/freedesktop/login1/session/_32'), ('6', 1001, 'test', 'seat0', '/org/freedesktop/login1/session/_36'), ('c2', 111, 'lightdm', 'seat0', '/org/freedesktop/login1/session/c2')]");

  for (gsize i = 0; i < g_variant_n_children (sessions); i++)
    {
      g_autoptr(GVariant) child = g_variant_get_child_value (sessions, i);
      g_message ("Child %" G_GSIZE_FORMAT ": %s", i, g_variant_get_type_string (child));

      guint32 uid;
      const gchar *id, *user, *seat, *session_path;

      g_variant_get (child, "(&su&s&s&o)", &id, &uid, &user, &seat, &session_path);

      g_message ("%s, %u, %s, %s, %s", id, uid, user, seat, session_path);
    }

  return 0;
}

它打印以下内容:

** Message: Child 0: (susso)
** Message: 2, 1000, nidhoegger, seat0, /org/freedesktop/login1/session/_32
** Message: Child 1: (susso)
** Message: 6, 1001, test, seat0, /org/freedesktop/login1/session/_36
** Message: Child 2: (susso)
** Message: c2, 111, lightdm, seat0, /org/freedesktop/login1/session/c2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取GVariant的内容 的相关文章

随机推荐

  • 需要将 git 分支重置为原始版本

    我不小心在一个本来不应该在的分支上工作了一段时间 所以我从它的分支上给它起了适当的名字 现在我想将我不应该进入的分支覆盖到原始版本 github 是否有捷径可寻 我尝试删除分支 然后重置跟踪分支 但它只是给了我再次正在处理的版本 如果你还没
  • 根据给定索引和元素数量的列表创建子列表。序言

    我正在尝试解决一个简单的序言问题 但我无法解决它 从列表中 需要创建一个给定索引 I 的子列表 然后从 I 中创建一个给定为 N 的下一个元素 如果索引大于列表长度 我将使子列表为空 如果 N 元素数量 大于列表中的其余元素 我将获得从 I
  • StackExchange API - 反序列化 JSON 响应中的日期

    我正在尝试使用 stackexchange api 我正在尝试获取一些用户信息 如果运行 您将获得 JSON 响应 items badge counts bronze 5630 silver 4212 gold 267 account id
  • 在Python中交换链表中的对,一个链接消失了?

    我一直在学习链表 并且在 python 中实现链表比我预期的要容易 然而 当涉及到解决 交换链表中的对 的问题时 由于某种原因 我的第二个链接在交换过程中消失了 我已经盯着这个问题很多年了 并尝试了在网上找到的不同解决方案 他们都得到相同的
  • 如何在 Swift 中使用闭包从字符串中提取两个整数来执行计算

    我目前正在使用mapSwift 中带有闭包的属性 用于从数组中提取线性因子并计算跨越一个八度音阶的音乐频率列表 let tonic Double 261 626 middle C let factors 1 0 1 125 1 25 1 3
  • 从 icc 获取 Intel 语法 asm 输出,而不是默认的 AT&T 语法?

    我陷入了一个问题 我已经使用 gcc 编译 汇编我的 C 代码一段时间了 并习惯于阅读 Intel 汇编语法 我用的是 masm intel生成程序集文件时的标志 但最近因为公司迁移 他们得到了Intel的icc 声称更好 所以现在我需要使
  • 访问 try-catch 块外部的变量

    我有以下代码 class ClassA public ClassA std string str std string GetSomething int main std string s try ClassA a ClassA s cat
  • 仅使用 css 而不使用 javascript 在悬停时显示叠加层

    当我将鼠标悬停在导航栏菜单上时 我试图制作整页叠加ul 覆盖层div位于页面顶部 当我将鼠标悬停在ul the li链接出现 但覆盖层不出现 我怎样才能使用 CSS 来显示叠加层 有人可以帮忙吗 这是 HTML 和 CSS 代码 标题的完整
  • 如何在 REST Web 服务中发送 JSON 数据?

    如何在 REST Web 服务中发送 JSON 数据 我有一个 json 对象 其中包含产品 Id 商店 Id 价格 产品单位 数量 值 这里除产品单位值外 所有值均为整数 现在 我想将这些值发送到其余的 Web 服务中 能否请您提供一些样
  • Angular2 Safari 后退按钮

    在实际的 Angular2 beta 14 及之前的版本 中 Safari 实际上使用 9 1 上的后退按钮 使用路由和多个视图时 似乎存在问题 https github com angular angular issues 7722 ht
  • 协议对保留计数有影响吗?

    我有一个非常简单的代码 我是故意使用委托创建内存循环 尝试观察和学习如何使用 Xcode 的 Memory Graph 我不明白的是为什么在连接部分 Xcode 说有3连接 应该只有2个 如果我用闭包创建一个内存循环 那么它会显示2连接 我
  • Spring 5 - 无 ServletContext 设置异常

    当我尝试使用 Spring 5 运行我的应用程序时AnnotationConfigApplicationContext类 获取异常No ServletContext set 这是我的主要方法 public class Run public
  • 标识列中存在重复值

    我有一个表 其中有一列名为id这是类型Identity 但此列包含重复值 1 8 然后又包含重复值 1 10 这怎么可能呢 我测试了 Giogri 所说的内容 如果在表有行后启用身份规范 至少在 2008 年 也可能是其他版本 数据库将从最
  • 如何在 Firestore 和 Android 中选择位置?

    我对 Cloud Firestore 非常陌生 所以请帮助我 我正在为青少年创建一个应用程序 我想在其中显示每个城市非常好的地点的列表 我还希望每个用户都可以将任何位置保存到最喜欢的部分 以便他或她可以向他或她的朋友显示该位置列表 我的实际
  • Realm = RLMRealm' 没有成员 'setDefaultRealmPath'

    我已将 Realm framework 和 RealSwift framework 添加到项目中 和 导入领域 虽然我收到此错误 RLMRealm 没有成员 setDefaultRealmPath let directory NSURL N
  • WebAssembly 从 wasm 调用 JavaScript 方法,即在 C++ 代码中

    我正在使用 WebAssembly 到目前为止 我能够管理 emscripten 将我的测试 C 项目编译为 wasm 文件 em 为我提供了 2 个文件 即 mainTest js mainTest wasm 当我在 html 页面中加载
  • 为什么向传递的 Iterator 引用添加 mut 可以解决这个问题?

    在下面的 Rust 代码片段中 fn main let list1 Vec
  • 根据区域大小在 NetLogo 中间隔代理

    我正在尝试在 NetLogo 中开发一个模型 其中动物代理将在每次模型启动时随机分布在空间中 然而 动物是有领地意识的 关于如何让动物从一定大小的圆形区域开始 可以与其他动物在一定程度上但不完全重叠 有什么建议吗 下面是我开始的代码片段 但
  • Compass/Sass 在 OSX 上为所有人组写入具有“无访问”权限的文件

    我正在使用 Sass 和 Compass 在 osx 上 并使用 compass watch 来编译我的 scss 文件 编译运行正常 因为使用正确的内容创建了 css 文件 但是 查看权限表明该文件是使用 Everyone 组编写的 具有
  • 获取GVariant的内容

    我目前尝试与 dbus 通信并有一个函数 该函数将返回array of struct string uint32 string string object path 我将结果存储在GVariant并打印这个GVariant显示那里有正确的结