我试图让我的程序通过发送相应的D-BUS消息来锁定和解锁GNOME屏幕。 通过shell中的dbus-send执行该参数,参数如下所示。
锁定:
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
解锁:
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.SetActive boolean:false
以下是C代码:
void sendDbusSignal(char *action)
{
DBusMessage* msg;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
DBusPendingCall* pending;
int ret;
dbus_bool_t v_BOOLEAN;
dbus_error_init(&err);
if ( strcmp(action, "SetActive") == 0 ) {
v_BOOLEAN = false;
printf("running dbus_message_iter_append_basic");
dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
}
// connect to the system bus and check for errors
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Connection Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (conn == NULL) {
exit(1);
}
// request our name on the bus
ret = dbus_bus_request_name(conn, "org.gnome.TypingMonitor", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
fprintf(stderr, "Name Error (%s)\n", err.message);
dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
exit(1);
}
msg = dbus_message_new_method_call("org.gnome.ScreenSaver", // target for the method call
"/org/gnome/ScreenSaver", // object to call on
"org.gnome.ScreenSaver", // interface to call on
action); // method name
dbus_message_iter_init_append(msg, &args);
// send message and get a handle for a reply
if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
if (pending == NULL) {
fprintf(stderr, "Pending Call Null\n");
exit(1);
}
dbus_connection_flush(conn);
printf("Request Sent\n");
// free message
dbus_message_unref(msg);
// free the pending message handle
dbus_pending_call_unref(pending);
}
int main()
{
sendDbusSignal("Lock");
sleep(5);
sendDbusSignal("SetActive");
return 0;
}
以下是我开球时会发生的事情:
有谁知道这里有什么问题?
答案 0 :(得分:2)
在初始化之前,你无法开始使用迭代器:dbus_message_iter_init_append()
调用需要在向它添加任何内容之前进行。
顺便说一下,如果您只是想从C中找到一种简单的方法来使用D-Bus,我真的建议您查看GDBus而不是使用低级别的libdbus API:它确实很多不那么痛苦。