方向 (パラメーター) 属性
方向属性は、データがクライアントからサーバー、サーバーからクライアント、またはその両方に送信されるかどうかを示します。 関数プロトタイプ内のすべてのパラメーターは、方向属性に関連付けられている必要があります。 方向属性の 3 つの可能な組み合わせは、1) [] の、2) [アウト]、3) [の、] です。 これらは、呼び出しプロシージャと呼び出しプロシージャの間でパラメーターを渡す方法について説明します。 既定 (Microsoft 拡張モード) でコンパイルし、パラメーターの方向属性を省略すると、MIDL コンパイラは既定値の [] のと見なします。
[out] パラメーターはポインターである必要があります。 実際、C 関数パラメーターは値渡しされるため、ポインターとして機能しないパラメーターに適用する場合、[out] 属性は意味がありません。 C では、呼び出された関数はパラメーター値のプライベート コピーを受け取ります。そのパラメーターの呼び出し元関数の値を変更することはできません。 ただし、パラメーターがポインターとして機能する場合は、メモリへのアクセスと変更に使用できます。 [out] 属性は、サーバー関数がクライアントの呼び出し元の関数に値を返す必要があり、ポインターに割り当てられている属性に従ってポインターに関連付けられているメモリを返す必要があることを示します。
次のインターフェイスは、パラメーターに適用できる方向属性の 3 つの可能な組み合わせを示しています。 InOutProc 関数は、IDL ファイルで次のように定義されます。
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
最初のパラメーター s1は、[] でのみ [です。 その値はリモート コンピューターに送信されますが、呼び出し元のプロシージャには返されません。 サーバー アプリケーションは、s1の値を変更できますが、クライアント上の s1 の値は、呼び出しの前後で同じです。
2 つ目のパラメーター ps2は、関数プロトタイプで 、の [] 属性と [] 属性の両方を持つポインターとして定義されます。 [] 属性の [は、パラメーターの値がクライアントからサーバーに渡されることを示します。 [out] 属性は、ps2 が指す値 クライアントに返されることを示します。
3 番目のパラメーターは [out] のみです。 サーバー上のパラメーターには領域が割り当てられますが、値はエントリでは未定義です。 前述のように、[アウト] パラメーターはすべてポインターである必要があります。
リモート プロシージャは 3 つのパラメーターの値をすべて変更しますが、[out] パラメーターと [] パラメーターの新しい値のみがクライアントで使用できます。
#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 番目のパラメーターが変更されます。 最初のパラメーター ([ののみ) は変更されません。
パラメーター
パラメーターする
インアウト パラメーターする