使用內容控制碼進行介面開發

一般而言,您會在 IDL 檔案中的類型定義上指定 [coNtext_handle] 屬性,以建立內容控制碼。 型別定義也會隱含指定內容執行常式,您必須提供此常式。 如果用戶端與伺服器之間的通訊中斷,伺服器執行時間會叫用此常式來執行任何必要的清除。 如需內容執行常式的詳細資訊,請參閱 伺服器內容執行常式

使用內容控制碼的介面必須具有初始系結的系結控制碼,必須先進行,伺服器才能傳回內容控制碼。 您可以使用自動、隱含或明確的系結控制碼來建立系結並建立內容。

內容控制碼必須是 void * 類型,或解析為 void *的類型。 伺服器程式會將它轉換成必要的類型。

注意

除了關閉內容控制碼的常式之外,不建議對內容控制碼參數使用 [inout]。 如果使用內容控制碼標示為 [inout] 的參數,請勿將 Null 或未初始化的內容控制碼從用戶端傳遞至伺服器。 應該改為傳遞內容控制碼的 Null 指標。 請注意,標示為 [in] 的內容控制碼參數不接受 Null 指標。

 

下列範例介面定義的片段顯示分散式應用程式如何使用內容控制碼讓伺服器開啟並更新每個用戶端的資料檔案。

介面必須包含遠端程序呼叫,以初始化控制碼,並將其設定為非Null 值。 在此範例中,RemoteOpen 函式會執行這項作業。 它會指定具有 [out] 方向屬性的內容控制碼。 或者,您可以將內容控制碼傳回為程式的傳回值。 不過,在此範例中,我們將透過參數清單傳遞內容控制碼。

在此範例中,內容資訊是檔案控制碼。 它會追蹤檔案中的目前位置。 介面會將檔案控制碼封裝為內容控制碼,並將它當做參數傳遞至遠端程序呼叫。 結構包含檔案名和檔案控制碼。

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

RemoteOpen 函式會建立有效的非Null 內容控制碼。 它會將內容控制碼傳遞至用戶端。 後續的遠端程序呼叫,例如 RemoteRead,請使用內容控制碼作為指標中的 。

除了初始化內容控制碼的遠端程式之外,介面還必須包含釋放伺服器內容並將內容控制碼設定為 Null的程式。 在上述範例中,RemoteClose 函式會執行這項作業。