次の方法で共有


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

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

パラメーター

パラメーターする

インアウト パラメーターする