1

ではDBUSXMLファイルで以下のコードを指定すると、戻り値の型proxyで関数が生成されるのはなぜですか?void

    <method name="getLocalTime">
        <arg type="s" name="timeString" direction="out" />
        <arg type="s" name="dateString" direction="out" />
    </method>


virtual void getMyTime(std::string& time, std::string& date) = 0;
4

1 に答える 1

2

DBus では、メソッド呼び出しからの出力は、従来の C 関数の戻りメカニズムではなく、引数リストを介して渡されます。さらに、メソッドが非同期でない場合は、1 つの true/false ブール値の結果 (従来の C 関数の return スタイルで返される) のみを返すことができます。このメソッドは複数の文字列値を返すため、イントロスペクションでは、このメソッドに非同期として注釈を付ける必要があります。プロキシ メソッド呼び出しは、結果を受け取る 2 つの文字列変数へのポインターを渡します。

例として dbus-glib を使用している場合...

<method name="getLocalTime">
    <arg type="s" name="timeString" direction="out" />
    <arg type="s" name="dateString" direction="out" />
    <annotate name="org.freedesktop.DBus.GLib.Async" />
</method>

次に、そのメソッドの実装で...

void 
dbus_service_get_local_time( 
    MyGObject* self, 
    DBusGMethodInvocation* context 
)
{
    char* timeString;
    char* dateString;

    // do stuff to create your two strings...

    dbus_g_method_return( context, timeString, dateString );

    // clean up allocated memory, etc...
}

呼び出し元の観点からは、プロキシ メソッド呼び出しは次のようになります...

gboolean 
dbus_supplicant_get_local_time( 
    DBusProxy* proxy, 
    char* OUT_timeString, 
    char* OUT_dateString, 
    GError** error 
);

プロキシ メソッドでは、gboolean の結果は、呼び出されたメソッドの結果ではなく、D-Bus 呼び出しが行われたかどうかであることに注意してください。

于 2013-03-23T14:31:28.987 に答える