次の関数プロトタイプでは、クライアントからサーバー、およびサーバーからクライアントの両方の方法で渡される単一カウント文字配列を使用します。
#define STRSIZE 500 //maximum string length
void Analyze(
[in, out, length_is(*pcbSize), size_is(STRSIZE)] char achInOut[],
[in, out] long *pcbSize);
[] パラメーターの [として、achInOut はクライアント側の有効なストレージを指す必要があります。 開発者は、リモート プロシージャ呼び出しを行う前に、クライアント側で配列に関連付けられているメモリを割り当てます。
スタブでは、strsize [size_is] パラメーターを使用してサーバーにメモリを割り当て、pcbSize [length_is] パラメーターを使用して配列要素をこのメモリに送信します。 開発者は、リモート プロシージャを呼び出す前に、クライアント コードによって [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;
}