共用方式為


基本和自訂系結控制碼

使用 handle_tRPC_BINDING_HANDLE 類型宣告的所有控制碼都是基本系結控制碼。 您可以擴充 handle_tRPC_BINDING_HANDLE 類型,以包含與基本控制碼類型所包含的更多或不同資訊。 當您這麼做時,您會建立自訂系結控制碼。

若要為分散式應用程式建立自訂系結控制碼,您必須建立自己的資料類型,並在 IDL 檔案中的類型定義上指定 [ handle] 屬性。 最後,存根檔案會將自訂系結控制碼對應至基本控制碼。

如果您建立自己的系結控制碼類型,也必須提供用戶端存根用來將自訂控制碼對應至基本控制碼的系結和解除系結常式。 存根會在每個遠端程序呼叫的開頭和結尾呼叫系結和解除系結常式。 系結和解除系結常式必須符合下列函式原型。

函式原型 描述
handle_t type_bind (類型) 系結常式
void type_unbind (類型handle_t) 解除系結常式

 

下列範例示範如何在 IDL 檔案中定義自訂系結控制碼:

/* usrdef.idl */
[
  uuid(20B309B1-015C-101A-B308-02608C4C9B53),
  version(1.0),
  pointer_default(unique)
]
interface usrdef
{
  typedef struct _DATA_TYPE 
  {
      unsigned char * pszUuid;
      unsigned char * pszProtocolSequence;
      unsigned char * pszNetworkAddress;
      unsigned char * pszEndpoint;
      unsigned char * pszOptions;
  } DATA_TYPE;
 
  typedef [handle] DATA_TYPE * DATA_HANDLE_TYPE;
  void UsrdefProc([in] DATA_HANDLE_TYPE  hBinding,
                  [in, string] unsigned char *   pszString);
 
  void Shutdown([in] DATA_HANDLE_TYPE hBinding);
}

如果系結常式發生錯誤,它應該使用 RpcRaiseException 函 式引發例外狀況。 用戶端存根接著會清除,並讓例外狀況篩選至用戶端上遠端程序呼叫周圍的例外狀況區塊。 如果系結常式只會傳回 Null,則用戶端程式代碼會取得錯誤RPC_S_INVALID_BINDING。 雖然在某些情況下可能可接受的情況,但其他情況 (,例如記憶體不足) 無法正確回應。 應該設計解除系結常式,使其不會失敗。 未系結常式不應該引發例外狀況。

程式設計人員定義的系結和解除系結常式會出現在用戶端應用程式中。 在下列範例中,系結常式會呼叫 RpcBindingFromStringBinding ,將字串系結資訊轉換為系結控制碼。 解除系結常式會呼叫 RpcBindingFree 以釋放系結控制碼。

程式設計人員定義系結控制碼的名稱DATA_HANDLE_TYPE會顯示為函式名稱的一部分。 它也會當做函式參數中的參數類型使用。

/* The client stub calls this _bind routine at the */
/* beginning of each remote procedure call                */
 
RPC_BINDING_HANDLE __RPC_USER DATA_HANDLE_TYPE_bind(
    DATA_HANDLE_TYPE dh1)
{
    RPC_BINDING_HANDLE hBinding;
    RPC_STATUS status;
 
    unsigned char *pszStringBinding;
 
    status = RpcStringBindingCompose(
          dh1.pszUuid,
          dh1.pszProtocolSequence,
          dh1.pszNetworkAddress,
          dh1.pszEndpoint,
          dh1.pszOptions,
          &pszStringBinding);
          ...
 
    status = RpcBindingFromStringBinding(
          pszStringBinding,
          &hBinding);
          ...
 
    status = RpcStringFree(&pszStringBinding); 
    ...
 
    return(hBinding);
}
 
/* The client stub calls this _unbind routine */
/* after each remote procedure call.                            */
void __RPC_USER DATA_HANDLE_TYPE_unbind(
    DATA_HANDLE_TYPE dh1, 
    RPC_BINDING_HANDLE h1)
{
    RPC_STATUS status;
    status = RpcBindingFree(&h1); 
    ...
}

隱含和明確系結控制碼可以是基本控制碼或自訂控制碼。 也就是說,控制碼可能是:

  • 基本型別和隱含
  • 自訂和隱含
  • 基本和明確
  • 自訂和明確