方向 (パラメーター) 属性
方向属性は、データがクライアントからサーバー、サーバーからクライアント、またはその両方に送信されるかどうかを示します。 関数プロトタイプ内のすべてのパラメーターは、方向属性に関連付けられている必要があります。 方向属性の 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 番目のパラメーターが変更されます。 最初のパラメーター ([入力] のみ) は変更されません。