私は小さなプロジェクトに取り組んでいます。私の OS は Linux (Ubuntu 11.04) です。DBus Daemon シグナル NameOwnerChanged に接続して、どのアプリがシャットダウンまたは起動されているかを示したいと思います。これを行うための小さなプログラムを作成しました。しかし、それは失敗しました。dbus の低レベルなしで、glib dbus のみを使用しました。
これが私のコードです:
/ gcc -o テスト main.cpkg-config --libs --cflags glib-2.0 dbus-1 dbus-glib-1
/
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-bindings.h>
#include <dbus/dbus-glib-lowlevel.h>
#define D_SERVICE "org.freedesktop.DBus"
#define D_PATH "/"
#define D_INTERFACE "org.freedesktop.DBus"
GMainLoop* loop;
DBusGConnection* conn;
DBusGProxy* d_proxy;
static void dbus_name_owner_changed(DBusGProxy *proxy, char* name, char* old, char* new, gpointer user_data)
{
g_print("%s owner change \n", name);
}
int main(int argc,char** argv)
{
g_type_init();
loop = g_main_loop_new(NULL, FALSE);
conn = dbus_g_bus_get(DBUS_BUS_SESSION,NULL);
d_proxy = dbus_g_proxy_new_for_name(conn, D_SERVICE, D_PATH, D_INTERFACE);
guint ret;
GError * error = NULL;
dbus_g_proxy_call( d_proxy, "RequestName", &error,
G_TYPE_STRING, "com.asianux.test",
G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
G_TYPE_INVALID,
G_TYPE_UINT, &ret,
G_TYPE_INVALID);
if(error==NULL && ret==DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
{
g_print("Request Name Success \n");
}
else
{
if(error)
{
g_print("Request Name Failed %s\n", error->message);
}
}
dbus_g_proxy_add_signal(d_proxy,"NameOwnerChanged",
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_INVALID);
dbus_g_proxy_connect_signal(d_proxy,"NameOwnerChanged",
G_CALLBACK(dbus_name_owner_changed),
NULL,NULL);
g_main_loop_run(loop);
}
コンパイルして実行しましたが、関数 dbus_name_owner_changed は実行されませんでした。信号を正常に接続できないのはなぜですか?
dbus_g_object_register_marshaller
信号を追加して信号を接続する前に見逃したことはわかっています。しかし、dbus_g_object_register_marshaller
コードに を追加しても失敗します。なんで?