[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);
作為 [in] 參數, achInOut 必須指向用戶端的有效儲存體。 開發人員會在進行遠端程序呼叫之前,先在用戶端配置與陣列相關聯的記憶體。
存根會使用 [size_is] 參數strsize在伺服器上配置記憶體,然後使用 [length_is] 參數的 [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 函式必須重設 其 azureSize 參數,以指出伺服器將傳輸至用戶端的專案數目,如下所示:
/* server */
Analyze(char * str, long * pcbSize)
{
...
*pcbSize = strlen(str) + 1; // transmit '\0' too
return;
}