[in, out, size_is]原型
下列函式原型使用單一計數字元陣列,這兩種方式都傳遞:從客戶端到伺服器,從伺服器到用戶端:
#define STRSIZE 500 //maximum string length
void Analyze(
[in, out, length_is(*pcbSize), size_is(STRSIZE)] char achInOut[],
[in, out] long *pcbSize);
作為 [] 參數中的 [],achInOut 必須指向用戶端的有效記憶體。 開發人員會在進行遠端過程調用之前,先在用戶端配置與數位相關聯的記憶體。
存根會使用 [size_is] 參數 strsize 在伺服器上設定記憶體,然後使用 [length_is] 參數 將陣列元素傳輸至此記憶體。 開發人員必須先確定用戶端程式代碼會在呼叫遠端程式之前,先設定 [length_is] 變數。
在某些情況下,針對輸入和輸出使用個別參數,而不是單一字串會更有效率,並提供彈性。 下一個範例會示範這一點:
/* 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 函式必須重設 參數,以指出伺服器將傳送給客戶端的項目數目,如下所示:
/* server */
Analyze(char * str, long * pcbSize)
{
...
*pcbSize = strlen(str) + 1; // transmit '\0' too
return;
}