方向 (パラメーター) 属性

方向属性は、データがクライアントからサーバー、サーバーからクライアント、またはその両方に送信されるかどうかを示します。 関数プロトタイプ内のすべてのパラメーターは、方向属性に関連付けられている必要があります。 方向属性の 3 つの組み合わせは、1) [in]、2) [out]、3) [in, out] です。 これらは、呼び出しと呼び出されたプロシージャの間でパラメーターを渡す方法について説明します。 既定 (Microsoft 拡張モード) でコンパイルし、パラメーターの方向属性を省略すると、MIDL コンパイラは既定値 [in] を想定します。

[out] パラメーターはポインターである必要があります。 実際、C 関数パラメーターは値によって渡されるため、ポインターとして機能しないパラメーターに適用する場合、[out] 属性は意味がありません。 C では、呼び出された関数はパラメーター値のプライベート コピーを受け取ります。そのパラメーターの呼び出し元関数の値を変更することはできません。 ただし、 パラメーターがポインターとして機能する場合は、メモリへのアクセスと変更に使用できます。 [出力] 属性は、サーバー関数がクライアントの呼び出し元の関数に値を返す必要があり、ポインターに関連付けられているメモリが、ポインターに割り当てられている属性に従って返されることを示します。

次のインターフェイスは、パラメーターに適用できる方向属性の 3 つの可能な組み合わせを示しています。 関数 InOutProc は、IDL ファイルで次のように定義されています。

void InOutProc ([in]       short     s1,
                [in, out]  short *  ps2,
                [out]      float *  pf3);

最初のパラメーター s1 は [in] のみです。 その値はリモート コンピューターに送信されますが、呼び出し元のプロシージャには返されません。 サーバー アプリケーションは s1 の値を変更できますが、クライアントの s1 の値は呼び出しの前後で同じです。

2 番目のパラメーター ps2 は、関数プロトタイプで [in] 属性と [out] 属性の両方を持つポインターとして定義されます。 [in] 属性は、パラメーターの値がクライアントからサーバーに渡されることを示します。 [out] 属性は、 ps2 が指す値がクライアントに返されることを示します。

3 番目のパラメーターは [out] のみです。 サーバー上の パラメーターには領域が割り当てられますが、エントリの値は未定義です。 前述のように、すべての [out] パラメーターはポインターである必要があります。

リモート プロシージャは、3 つのパラメーターの値をすべて変更しますが、[out] パラメーターと [in] パラメーターの新しい値のみがクライアント使用できます。

#define MAX 257

void InOutProc(short    s1,
               short * ps2,
               float * pf3)
{
    *pf3 = (float) s1 / (float) *ps2;
    *ps2 = (short) MAX - s1;
    s1++;  // in only; not changed on the client side
    return;
}

InOutProc の呼び出しから返されると、2 番目と 3 番目のパラメーターが変更されます。 最初のパラメーター ([入力] のみ) は変更されません。

パラメーター内

out パラメーター

in-out パラメーター