How to compile a basic D-Bus/glib example?

后端 未结 5 1999
攒了一身酷
攒了一身酷 2021-02-05 07:32

I\'m trying to learn how to use D-Bus with C bindings. I\'ve never used D-Bus before. I\'m following this tutorial, which I assume is the official one (Freedesktop.org). I\'ve r

5条回答
  •  闹比i
    闹比i (楼主)
    2021-02-05 07:56

    Based on 'netcoder's' answer is the program that worked for me.

    #include           // for exit()   
    #include        // for dbus_*   
    #include   // for dbus_g_*
    
    int
    main (int argc, char **argv)
    {
      DBusGConnection *connection;
      GError *error;
      DBusGProxy *proxy;
      char **name_list;
      char **name_list_ptr;
    
      g_type_init ();
    
      error = NULL;
      connection = dbus_g_bus_get (DBUS_BUS_SESSION,
                               &error);
      if (connection == NULL)
        {
          g_printerr ("Failed to open connection to bus: %s\n",
                  error->message);
          g_error_free (error);
          exit (1);
        }
    
      /* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
    
      proxy = dbus_g_proxy_new_for_name (connection,
                                     DBUS_SERVICE_DBUS,
                                     DBUS_PATH_DBUS,
                                     DBUS_INTERFACE_DBUS);
    
      /* Call ListNames method, wait for reply */
      error = NULL;
      if (!dbus_g_proxy_call (proxy, "ListNames", &error, G_TYPE_INVALID,
                          G_TYPE_STRV, &name_list, G_TYPE_INVALID))
        {
          /* Just do demonstrate remote exceptions versus regular GError */
          if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
        g_printerr ("Caught remote method exception %s: %s",
                dbus_g_error_get_name (error),
                error->message);
          else
        g_printerr ("Error: %s\n", error->message);
          g_error_free (error);
          exit (1);
        }
    
      /* Print the results */
    
      g_print ("Names on the message bus:\n");
    
      for (name_list_ptr = name_list; *name_list_ptr; name_list_ptr++)
        {
          g_print ("  %s\n", *name_list_ptr);
        }
      g_strfreev (name_list);
    
      g_object_unref (proxy);
    
      return 0;
    }
    

    and Makefile

    file=1
    sample:
        g++ -g $(file).cc -o $(file) -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -ldbus-1 -ldbus-glib-1 -Wall -Wextra -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0 
    

    Note: This webpage has a good D-bus example https://developer.gnome.org/gio//2.36/GDBusProxy.html

提交回复
热议问题