다음을 통해 공유


기본 및 사용자 지정 바인딩 핸들

handle_t 또는 RPC_BINDING_HANDLE 형식으로 선언된 모든 핸들은 기본 바인딩 핸들입니다. 기본 핸들 형식에 포함된 것과 다른 정보를 포함하도록 handle_t 또는 RPC_BINDING_HANDLE 형식을 확장할 수 있습니다. 이렇게 하면 사용자 지정 바인딩 핸들을 만듭니다.

분산 애플리케이션에 대한 사용자 지정 바인딩 핸들을 만들려면 사용자 고유의 데이터 형식을 만들고 IDL 파일의 형식 정의에 [ 핸들] 특성을 지정해야 합니다. 궁극적으로 스텁 파일은 사용자 지정 바인딩 핸들을 기본 핸들에 매핑합니다.

고유한 바인딩 핸들 형식을 만드는 경우 클라이언트 스텁이 사용자 지정 핸들을 기본 핸들에 매핑하는 데 사용하는 바인딩 및 바인딩 해제 루틴도 제공해야 합니다. 스텁은 각 원격 프로시저 호출의 시작과 끝에서 바인딩 및 바인딩 해제 루틴을 호출합니다. 바인딩 및 바인딩되지 않은 루틴은 다음 함수 프로토타입을 준수해야 합니다.

함수 프로토타입 설명
handle_t type_bind(type) 바인딩 루틴
void type_unbind(type, 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); 
    ...
}

암시적 및 명시적 바인딩 핸들은 모두 기본 또는 사용자 지정 핸들일 수 있습니다. 즉, 핸들은 다음과 같습니다.

  • 기본 및 암시적
  • 사용자 지정 및 암시적
  • 기본 및 명시적
  • 사용자 지정 및 명시적