context_handle 특성
[context_handle] 특성은 원격 프로시저 호출 간에 서버에서 컨텍스트 또는 상태 정보를 유지하는 바인딩 핸들을 식별합니다.
typedef [context_handle [ , type-attribute-list ] ] type-specifier declarator-list;
[context_handle [, function-attr-list ] ] type-specifier [ptr-decl] function-name(
[ [parameter-attribute-list] ] type-specifier [declarator], ...);
[ [ function-attr-list ] ] type-specifier [ ptr-decl ] function-name(
[context_handle [ , parameter-attribute-list ] ] type-specifier [declarator], ...);
[ void __RPC_USER context-handle-type_rundown (
context-handle-type); ]
매개 변수
-
type-attribute-list
-
형식에 적용되는 하나 이상의 특성을 지정합니다.
-
type-specifier
-
포인터 형식 또는 형식 식별자를 지정합니다. 선택적 스토리지 사양은 형식 지정자 앞에 설 수 있습니다.
-
declarator 및 declarator-list
-
식별자, 포인터 선언자 및 배열 선언자와 같은 표준 C 선언자를 지정합니다. 컨텍스트 핸들에 대한 선언자는 하나 이상의 포인터 선언자를 포함해야 합니다. 자세한 내용은 배열 및 Sized-Pointer 특성, 배열 및 배열 및 포인터를 참조하세요. declarator-list는 하나 이상의 선언자로 구성되며 쉼표로 구분됩니다. 함수 선언자의 매개 변수 이름 식별자는 선택 사항입니다.
-
function-attr-list
-
함수에 적용되는 0개 이상의 특성을 지정합니다. 유효한 함수 특성은 [콜백], [로컬]입니다. 포인터 특성 [ref], [unique] 또는 [ptr]; 및 사용 특성 [문자열], [무시] 및 [context_handle].
-
ptr-decl
-
포인터 선언자를 0개 이상 지정합니다. 포인터 선언자는 C에서 사용되는 포인터 선언자와 동일합니다. 지정자, 한정자(예: far) 및 한정자 const에서 * 생성됩니다.
-
function-name
-
원격 프로시저의 이름을 지정합니다.
-
parameter-attribute-list
-
지정된 매개 변수 형식에 적합한 0개 이상의 방향 특성, 필드 특성, 사용 특성 및 포인터 특성을 지정합니다. 여러 특성을 쉼표로 구분합니다.
-
context-handle-type
-
[context_handle] 특성을 사용하는 typedef 선언에 정의된 컨텍스트 핸들 형식을 지정하는 식별자를 지정합니다. 런다운 루틴은 선택 사항입니다.
Windows Server 2003 및 Windows XP: 단일 인터페이스는 직렬화된 컨텍스트 핸들과 비직렬화된 컨텍스트 핸들을 모두 수용할 수 있으므로 인터페이스의 한 메서드가 컨텍스트 핸들에 단독으로 액세스(직렬화됨)할 수 있는 반면, 다른 메서드는 공유 모드(비저장형)에서 해당 컨텍스트 핸들에 액세스할 수 있습니다. 이러한 액세스 기능은 읽기/쓰기 잠금 메커니즘과 비슷합니다. serialize된 컨텍스트 핸들을 사용하는 메서드는 단독 사용자(기록기)인 반면, 비제어형 컨텍스트 핸들을 사용하는 메서드는 공유 사용자(판독기)입니다. 컨텍스트 핸들의 상태를 삭제하거나 수정하는 메서드를 serialize해야 합니다. 컨텍스트 핸들에서 단순히 읽는 메서드와 같이 컨텍스트 핸들의 상태를 수정하지 않는 메서드는 비직렬화될 수 있습니다. 만들기 메서드는 암시적으로 serialize됩니다.
설명
[context_handle] 특성은 IDL typedef 형식 특성, 함수 반환 형식 특성 또는 매개 변수 특성으로 표시할 수 있습니다. 형식 정의에 [context_handle] 특성을 적용하는 경우 컨텍스트 런다운 루틴도 제공해야 합니다. 자세한 내용은 서버 컨텍스트 런다운 루틴 을 참조하세요.
MIDL 컴파일러를 기본(/ms_ext) 모드에서 사용하는 경우 여기에 설명된 컨텍스트 핸들에 대한 요구 사항을 준수하는 한 컨텍스트 핸들은 사용자가 선택한 포인터 형식일 수 있습니다. 이러한 컨텍스트 핸들 형식과 연결된 데이터는 네트워크에서 전송되지 않으며 서버 애플리케이션에서만 조작해야 합니다. DCE IDL 컴파일러가 컨텍스트 핸들을 void* 형식의 포인터로 제한합니다. 따라서 MIDL 컴파일러 /osf 스위치를 사용하는 경우 이 기능을 사용할 수 없습니다.
다른 핸들 형식과 마찬가지로 컨텍스트 핸들은 클라이언트 애플리케이션에 불투명하며 연결된 모든 데이터는 전송되지 않습니다. 서버에서 컨텍스트 핸들은 활성 컨텍스트의 핸들 역할을 하며 컨텍스트 핸들 형식과 연결된 모든 데이터에 액세스할 수 있습니다.
컨텍스트 핸들을 만들기 위해 클라이언트는 컨텍스트 핸들에 대한 [out], [ref] 포인터를 서버에 전달합니다. 컨텍스트 핸들 자체는 해당 값이 포인터 특성과 일치하는 경우 NULL 또는 NULL 이 아닌 값을 가질 수 있습니다. 예를 들어 컨텍스트 핸들 형식에 [ref] 특성이 적용된 경우 NULL 값을 가질 수 없습니다.) 컨텍스트 핸들이 만들어질 때까지 바인딩을 수행하려면 다른 바인딩 핸들을 제공해야 합니다. 명시적 핸들을 지정하지 않으면 암시적 바인딩이 사용됩니다. [implicit_handle] 특성이 없으면 자동 핸들이 사용됩니다.
서버의 원격 프로시저는 활성 컨텍스트 핸들을 만듭니다. 클라이언트는 후속 호출에서 해당 컨텍스트 핸들을 [in] 또는 [in, out] 매개 변수로 사용해야 합니다. [in]전용 컨텍스트 핸들을 바인딩 핸들로 사용할 수 있으므로 NULL이 아닌 값이 있어야 합니다. [in]전용 컨텍스트 핸들은 서버의 상태 변경 내용을 반영하지 않습니다.
서버에서 호출된 프로시저는 필요에 따라 컨텍스트 핸들을 해석할 수 있습니다. 예를 들어 호출된 프로시저는 힙 스토리지를 할당하고 컨텍스트 핸들을 이 스토리지에 대한 포인터로 사용할 수 있습니다.
컨텍스트 핸들을 닫기 위해 클라이언트는 컨텍스트 핸들을 [in], [out] 인수로 전달합니다. 서버는 더 이상 호출자를 대신하여 컨텍스트를 유지 관리하지 않는 경우 NULL 컨텍스트 핸들을 반환해야 합니다. 예를 들어 컨텍스트 핸들이 열려 있는 파일을 나타내고 호출이 파일을 닫는 경우 서버는 컨텍스트 핸들을 NULL 로 설정하고 클라이언트에 반환해야 합니다. NULL 값은 후속 호출에 대한 바인딩 핸들로 유효하지 않습니다.
컨텍스트 핸들은 하나의 서버에 대해서만 유효합니다. 함수에 두 개의 핸들 매개 변수가 있고 컨텍스트 핸들이 NULL이 아닌 경우 바인딩 핸들은 동일한 주소 공간을 참조해야 합니다.
함수에 [in] 또는 [in, out] 컨텍스트 핸들이 있는 경우 해당 컨텍스트 핸들을 바인딩 핸들로 사용할 수 있습니다. 이 경우 암시적 바인딩이 사용되지 않고 [implicit_handle] 또는 [auto_handle] 특성이 무시됩니다.
컨텍스트 핸들에는 다음과 같은 제한이 적용됩니다.
- 컨텍스트 핸들은 배열 요소, 구조체 멤버 또는 공용 구조체 멤버일 수 없습니다. 매개 변수만 사용할 수 있습니다.
- 컨텍스트 핸들에는 [transmit_as] 또는 [represent_as] 특성이 있을 수 없습니다.
- [out] 컨텍스트 핸들에 대한 포인터인 매개 변수는 [ref] 포인터여야 합니다.
- [in] 컨텍스트 핸들은 바인딩 핸들로 사용할 수 있으며 NULL일 수 없습니다.
- 입력 시 [in, out 컨텍스트 핸들은 NULL일 수 있지만 프로시저에 다른 명시적 핸들 매개 변수가 있는 경우에만 가능합니다. 다른 명시적 비 NULL 컨텍스트 핸들 매개 변수가 없는 경우 [in, out] 컨텍스트 핸들은 NULL일 수 없습니다.
- 컨텍스트 핸들은 콜백과 함께 사용할 수 없습니다.
예
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
short RemoteFunc1([out] PCONTEXT_HANDLE_TYPE * pCxHandle);
short RemoteFunc2([in, out] PCONTEXT_HANDLE_TYPE * pCxHandle);
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown (PCONTEXT_HANDLE_TYPE);
참고 항목