方向 (參數) 屬性
方向屬性描述資料是從用戶端傳輸至伺服器、伺服器到用戶端,還是兩者。 函式原型中的所有參數都必須與方向屬性相關聯。 三個可能的方向屬性組合包括:1 個) [in]、2 個) [out],以及 3 個) [in, out]。 這些描述在呼叫和呼叫程式之間傳遞參數的方式。 當您在預設 (Microsoft 擴充模式) 編譯,而且省略參數的方向屬性時,MIDL 編譯器會假設預設值為 [in]。
[out] 參數必須是指標。 事實上,當套用至不做為指標的參數時,[out] 屬性並不有意義,因為 C 函式參數會以傳值方式傳遞。 在 C 中,呼叫的函式會收到參數值的私人複本;它無法變更該參數的呼叫函式值。 不過,如果參數做為指標,它可以用來存取和修改記憶體。 [out] 屬性工作表示伺服器函式應該將值傳回給用戶端的呼叫函式,而且與指標相關聯的記憶體應該根據指派給指標的屬性傳回。
下列介面示範可套用至參數之方向屬性的三個可能組合。 InOutProc函式會在 IDL 檔案中定義為:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
第一個參數 s1僅限 [in]。 其值會傳送至遠端電腦,但不會傳回給呼叫程式。 雖然伺服器應用程式可以變更 s1的值,但用戶端上的 s1 值在呼叫前後相同。
第二個參數 ps2會在函式原型中定義為指標,其中包含 [in] 和 [out] 屬性。 [in] 屬性工作表示參數的值是從用戶端傳遞至伺服器。 [out] 屬性工作表示 ps2 所指向的值會傳回給用戶端。
第三個參數僅限 [out]。 空間會配置給伺服器上的 參數,但在專案上未定義值。 如上所述,所有 [out] 參數都必須是指標。
遠端程式會變更這三個參數的值,但用戶端只能使用 [out] 和 [in] 參數的新值。
#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傳回時,會修改第二個和第三個參數。 只有 [in] 的第一個參數不會變更。