컨텍스트 핸들을 사용한 인터페이스 개발
일반적으로 IDL 파일의 형식 정의에 [context_handle] 특성을 지정하여 컨텍스트 핸들을 만듭니다. 또한 형식 정의는 제공해야 하는 컨텍스트 런다운 루틴을 암시적으로 지정합니다. 클라이언트와 서버 간의 통신이 중단되면 서버 런타임은 이 루틴을 호출하여 필요한 정리를 수행합니다. 컨텍스트 런다운 루틴에 대한 자세한 내용은 서버 컨텍스트 런다운 루틴을 참조하세요.
컨텍스트 핸들을 사용하는 인터페이스에는 서버가 컨텍스트 핸들을 반환하기 전에 수행해야 하는 초기 바인딩에 대한 바인딩 핸들이 있어야 합니다. 자동, 암시적 또는 명시적 바인딩 핸들을 사용하여 바인딩을 만들고 컨텍스트를 설정할 수 있습니다.
컨텍스트 핸들은 void * 형식이거나 void *로 확인되는 형식이어야 합니다. 서버 프로그램은 이를 필요한 형식으로 캐스팅합니다.
참고
컨텍스트 핸들 매개 변수에 [in, out]을 사용하는 것은 컨텍스트 핸들을 닫는 루틴을 제외하고는 권장되지 않습니다. 컨텍스트 핸들이 [in, out]로 표시된 매개 변수를 사용하는 경우 클라이언트에서 서버로 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 함수는 이 작업을 수행합니다.