2016-02-01 83 views
1

我想通過使用GDBus的DBus調用遠程方法。我的問題是方法調用成功,但方法的返回值(作爲GVariant可用)包含一個數組作爲其元素。當我嘗試使用GVariantIter遍歷它時,它會導致分段錯誤。但是,如果我使用g_variant_print()將它打印到標準輸出,它將成功打印數據。我究竟做錯了什麼 ?指定的格式字符串是正確的,我使用g_variant_get_type_string()檢查了它。我的代碼片段如下。如果我沒有記錯的話無法使用迭代器迭代具有數組類型的GVariant

 GVariantIter* iter; 
     gint16 res, mts, vlm; 
     guint16 sid; 
     char * sname ; 
     GVariant* avail ; 
     guint16 clsid; 
     GVariant* retvalue = g_dbus_proxy_call_sync (proxy, 
            "Method", 
            "", //no parameters 
            G_DBUS_CALL_FLAGS_NONE, 
            -1, 
            NULL, 
            &error 
           ); 

     g_variant_get(retvalue, "(na(qs(nn)nnq))",&res, &iter); 
     while (g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid, &sname, &avail, &mts, &vlm, &clsid)) 
     { 
      // Operate on the variables 
     } 

回答

2

g_dbus_proxy_call_sync()返回一個元組內的GVariant。你需要做的是在你創建迭代器之前打開元組。

嘗試這樣做,而不是你叫g_dbus_proxy_call_sync後:

GVariantIter *iter; 
GVariant *temp; 

temp = g_variant_get_child_value (retvalue, 0); 

iter = g_variant_iter_new (temp); 

while (g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid, 
    &sname, &avail, &mts, &vlm, &clsid)) 
{ 
    //operate 
}