[入力、出力、size_is]プロトタイプ
次の関数プロトタイプでは、クライアントからサーバー、およびサーバーからクライアントの両方の方法で渡される単一カウント文字配列を使用します。
#define STRSIZE 500 //maximum string length
void Analyze(
[in, out, length_is(*pcbSize), size_is(STRSIZE)] char achInOut[],
[in, out] long *pcbSize);
[in] パラメーターとして、 achInOut は クライアント側の有効なストレージを指す必要があります。 開発者は、リモート プロシージャ 呼び出しを行う前に、クライアント側で 配列に関連付けられているメモリを割り当てます。
スタブでは、[size_is] パラメーター strsize を使用してサーバーにメモリを割り当て、次に [length_is] パラメーター pcbSize を使用して配列要素をこのメモリに送信します。 開発者は、リモート プロシージャを呼び出す前に、クライアント コードによって [length_is] 変数が設定されていることを確認する必要があります。
場合によっては、入力と出力に 1 つの文字列ではなく個別のパラメーターを使用する方が効率的であり、柔軟性が提供されます。 これは、次の例で示されています。
/* client */
char achInOut[STRSIZE];
long cbSize;
...
gets_s(achInOut, STRSIZE); // get patient input
cbSize = strlen(achInOut) + 1; // transmit '\0' too
Analyze(achInOut, &cbSize);
前の例では、文字配列 achInOut も [out] パラメーターとして使用されています。 C では、配列の名前はポインターの使用と同じです。 既定では、すべての最上位ポインターは参照ポインターです。値は変更されず、呼び出しの前後にクライアント上の同じメモリ領域を指します。 リモート プロシージャがアクセスするすべてのメモリは、呼び出しの前にクライアントが指定したサイズに収まる必要があります。または、スタブによって例外が生成されます。
返す前に、サーバー上の Analyze 関数で pcbSize パラメーターをリセットして、次のようにサーバーがクライアントに送信する要素の数を示す必要があります。
/* server */
Analyze(char * str, long * pcbSize)
{
...
*pcbSize = strlen(str) + 1; // transmit '\0' too
return;
}