使用內容控制碼進行用戶端開發

用戶端程式對於內容控制碼的唯一使用方式是每次用戶端進行遠端程序呼叫時,將它傳遞至伺服器。 用戶端應用程式不需要存取控制碼的內容。 它不應該嘗試以任何方式變更內容控制碼資料。 用戶端叫用的遠端程式會在伺服器的內容上執行所有必要的作業。

在向伺服器要求內容控制碼之前,用戶端必須建立與伺服器的系結。 用戶端可以使用自動、隱含或明確的系結控制碼。 透過有效的系結控制碼,用戶端可以在伺服器上呼叫遠端程式,以傳回已開啟 (非Null) 內容控制碼,或透過遠端程式參數清單中的 [out] 參數傳遞一個。

用戶端可以使用任何需要的方式使用開啟的內容控制碼。 不過,當不再需要控制碼時,它們應該會使控制碼失效。 有兩種方式可以執行此動作:

  • 若要叫用伺服器程式所提供的遠端程式,以釋放內容並關閉內容控制碼, (將其設定為 Null) 。
  • 當伺服器無法連線時,請呼叫 RpcSsDestroyClientCoNtext 函式。

第二種方法只會清除用戶端狀態,而且不會清除伺服器端狀態,因此只有在懷疑網路分割時才會使用它,而用戶端和伺服器將會執行獨立的清除。 伺服器會透過執行常式執行獨立清除,用戶端會使用 RpcSsDestroyClientCoNtext 函式來執行此動作。

下列程式碼片段示範用戶端如何使用內容控制碼的範例。 若要檢視此範例所使用的介面定義,請參閱 使用內容控制碼進行介面開發。 如需伺服器實作,請參閱 使用內容控制碼進行伺服器開發

在此範例中,用戶端會呼叫 RemoteOpen,以取得包含有效資料的內容控制碼。 然後,用戶端就可以在遠端程序呼叫中使用內容控制碼。 因為不再需要系結控制碼,所以用戶端可以釋放用來建立內容控制碼的明確控制碼:

// cxhndlc.c  (fragment of client side application)
printf("Calling the remote procedure RemoteOpen\n");
if (RemoteOpen(&phContext, pszFileName) < 0) 
{
    printf("Unable to open %s\n", pszFileName);
    Shutdown();
    exit(2);
}
 
// Now the context handle also manages the binding.
// The variable hBindingHandle is a valid binding handle.
status = RpcBindingFree(&hBindingHandle);
printf("RpcBindingFree returned 0x%x\n", status);
if (status) 
    exit(status);

此範例中的用戶端應用程式會使用稱為 RemoteRead 的程式,讀取伺服器上的資料檔案,直到遇到檔案結尾為止。 然後呼叫 RemoteClose 來關閉檔案。 內容控制碼會顯示為 RemoteRead 和 RemoteClose 函式中的參數::

printf("Calling the remote procedure RemoteRead\n");
do 
{
    cbRead = 1024; // Using a 1K buffer
    RemoteRead(phContext, pbBuf, &cbRead);
    // cbRead contains the number of bytes actually read.
    for (int i = 0; i < cbRead; i++)
        putchar(*(pbBuf+i));
} while(cbRead);
 
printf("Calling the remote procedure RemoteClose\n");
if (RemoteClose(&phContext) < 0 ) 
{
    printf("Close failed on %s\n", pszFileName);
    exit(2);
}