2017-08-31 12 views
0

C++でインターフェイス定義言語とリモートプロシージャコールを使用してサーバーとクライアントを作成しています。 [in]属性のクライアントからサーバーにデータを送信できます。今私はサーバーがクライアントにデータを返信したい。しかし、私は正しいデータを受け取れませんでした。リモートプロシージャコールとMIDL:[out]属性で関数を実装する方法は?

以下のように私はの.idlインタフェースに関数を定義:MIDLドキュメントは、リモートプロシージャである場合

アン[OUT]のみのパラメータは未定義されると仮定されていることを言う

[ 
    //uuid and verison define here 
] 

interface utility{ 
    void sendData([in] int numIn, [out] int *numOut); 
} 

オブジェクトのメモリがサーバーによって割り当てられます。

したがって、client.cppでは、変数をインスタンス化してfuncitonを呼び出します。 server.cppで

RpcTryExcept{ 
    int *num; 
    sendData(hBinding, 123, num); 
} 

void sendData(handle_t IDL_handle, int numIn, int *numOut){ 
    numOut = new int[3]; 
    numOut[0] = 1; 
    numOut[1] = 2; 
    numOut[2] = 3;  
} 

私は、クライアントでのint配列を印刷し、そして3個の乱数を取得します。私はまた、最初にクライアントのサイズを定義しようとしました。 int *num = new int[3]。今回は、numOut [0]の値をクライアントに渡すことができますが、他のインデックスはすべて乱されています。私もchar配列を試してみましたが、良いことはありません。たぶん私は何かを誤解します。誰か私にいくつかのアイデアを与えることができますありがとう。

答えて

0

コード

void sendData(handle_t IDL_handle, int numIn, int *numOut){ 
    numOut = new int[3]; 
    numOut[0] = 1; 
    numOut[1] = 2; 
    numOut[2] = 3;  
} 

は、ポインタのみパラメータの値のコピーを変更し、メモリリークが残ります。

私は実装がかなりの署名ではなく、再びあなたのIDL定義を確認してください

void sendData(handle_t IDL_handle, int numIn, int **numOut); 

ようになり[out]パラメータを持つ配列を返すには

void sendData(handle_t IDL_handle, int numIn, int *numOut){ 
    *numOut = 42; 
} 

のようになります疑うだろう。

+0

ありがとう、それは動作します。今私はちょっと混乱しています。サーバーがクライアントにint配列またはfloat配列(私はファイルをfloat配列に読み込む)を送るとき、それはIDLのfloat *またはfloat []で動作します。しかし、クライアントがサーバーにデータを送信すると、それは異なる動作を示します。私はそれを理解しようとします。 – tianhuaf

関連する問題