핸들
프로시저 주소 핸들의 형식 문자열 설명에 있는 두 부분으로 구성됩니다. 첫 번째 부분은 암시적 핸들을 나타내는 데 사용되는 프로시저 설명의 handle_type<1> 필드입니다. 이 부분은 항상 존재합니다. 두 번째 부분은 프로시저의 명시적 핸들에 대한 매개 변수 설명입니다. 둘 다 바인딩 핸들 문제에 대한 Stub 설명자 구조의 추가 MIDL 컴파일러 지원에 대한 설명과 함께 다음 섹션에서 설명합니다.
프로시저가 바인딩에 암시적 핸들을 사용하는 경우 프로시저 설명의 handle_type<1> 필드에는 유효한 0이 아닌 세 가지 값 중 하나가 포함됩니다. 암시적 핸들에 대한 MIDL 컴파일러 지원은 Stub 설명자 구조의 IMPLICIT_HANDLE_INFO 필드에 있습니다.
typedef (__RPC_FAR * GENERIC_BINDING_ROUTINE)();
typedef struct
{
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_ROUTINE_PAIR;
typedef struct __GENERIC_BINDING_INFO
{
void __RPC_FAR* pObj;
unsigned char Size;
GENERIC_BINDING_ROUTINE pfnBind;
GENERIC_BINDING_ROUTINE pfnUnbind;
} GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO;
union
{
handle_t* pAutoHandle;
handle_t* pPrimitiveHandle;
PGENERIC_BINDING_INFO pGenericBindingInfo;
} IMPLICIT_HANDLE_INFO;
프로시저에서 자동 핸들을 사용하는 경우 pAutoHandle 멤버는 정의된 스텁–자동 핸들 변수의 주소를 포함합니다.
프로시저에서 암시적 기본 핸들을 사용하는 경우 pPrimitiveHandle 멤버에는 정의된 스텁-기본 핸들 변수의 주소가 포함됩니다.
마지막으로 프로시저에서 암시적 제네릭 핸들을 사용하는 경우 pGenericBindingInfo 멤버는 해당 GENERIC_BINDING_INFO 구조체에 대한 포인터의 주소를 보유합니다. MIDL_STUB_DESC 데이터 구조체에는 GENERIC_BINDING_PAIR 구조체 컬렉션에 대한 포인터가 포함되어 있습니다. 이 컬렉션의 0 위치에 있는 항목은 IMPLICIT_HANDLE_INFOpGenericBindingInfo에서 참조하는 제네릭 바인딩 핸들에 해당하는 바인딩 및 바인딩되지 않은 루틴에 예약되어 있습니다. 암시적 바인딩 핸들의 형식은 형식 문자열에 표시됩니다.
컨텍스트, 제네릭 및 기본 형식의 세 가지 가능한 명시적 핸들 형식이 있습니다. 명시적 핸들(또는 동일한 방식으로 처리되는 [out] 전용 컨텍스트 핸들)의 경우 바인딩 핸들 정보가 프로시저의 매개 변수 중 하나로 나타납니다. 세 가지 가능한 설명은 다음과 같습니다.
기본 유형
FC_BIND_PRIMITIVE, flag<1>, offset<2>.
플래그<1> 은 핸들이 포인터로 전달되는지 여부를 나타냅니다.
오프셋<2> 는 스택의 시작 부분에서 기본 핸들로 오프셋을 제공합니다.
참고
형식 형식 문자열의 기본 핸들 설명은 단일 FC_IGNORE 축소됩니다.
일반
FC_BIND_GENERIC, flag_and_size<1>, offset<2>, binding_routine_pair_index<1>, FC_PAD
flag_and _size<1> 에는 위쪽 깃발 니블과 낮은 크기의 니블이 있습니다. 플래그는 핸들이 포인터로 전달되는지 여부를 나타냅니다. 크기 필드는 사용자 정의-제네릭 핸들 형식의 크기를 제공합니다. 이 크기는 32비트 시스템의 경우 1, 2 또는 4바이트, 64비트 시스템에서는 1, 2, 4 또는 8바이트로 제한됩니다.
오프셋<2> 필드는 지정된 크기의 데이터에 대한 포인터 스택의 시작 부분에서 오프셋을 제공합니다.
binding_routine_pair_index<1> 필드는 스텁 설명자의 aGenericBindingRoutinePairs 필드에 인덱스를 제네릭 핸들에 대한 바인딩 및 바인딩되지 않은 루틴 함수 포인터에 제공합니다.
참고
형식 형식의 제네릭 핸들 설명은 관련 데이터 형식에 대한 설명입니다.
Context
FC_BIND_CONTEXT flags<1> offset<2> context_rundown_routine_index<1> param_num<1>
플래그<1> 은 핸들이 전달되는 방식과 핸들의 형식을 나타냅니다. 유효한 플래그는 다음 표에 나와 있습니다.
Hex | 플래그 |
---|---|
80 | HANDLE_PARAM_IS_VIA_PTR |
40 | HANDLE_PARAM_IS_IN |
20 | HANDLE_PARAM_IS_OUT |
21 | HANDLE_PARAM_IS_RETURN |
08 | NDR_STRICT_CONTEXT_HANDLE |
04 | NDR_CONTEXT_HANDLE_NO_SERIALIZE |
02 | NDR_CONTEXT_HANDLE_SERIALIZE |
01 | NDR_CONTEXT_HANDLE_CANNOT_BE_NULL |
처음 네 개의 플래그는 항상 존재하고, 마지막 4개는 Windows 2000에 추가되었습니다.
오프셋<2> 필드는 스택 시작부터 컨텍스트 핸들까지 오프셋을 제공합니다.
context_rundown_routine_index<1> 은 이 컨텍스트 핸들에 사용되는 런다운 루틴에 대한 스텁 설명자의 apfnNdrRundownRoutines 필드에 인덱스를 제공합니다. 컴파일러는 항상 인덱스를 생성합니다. 런다운 루틴이 없는 루틴의 경우 null을 보유하는 테이블 위치에 대한 인덱스입니다.
–Oi2에서 빌드된 스텁의 경우 param_num<1>은 0부터 시작하여 지정된 프로시저에 있는 컨텍스트 핸들을 지정하는 서수 수를 제공합니다.
이전 버전의 인터프리터의 경우 param_num<1> 은 프로시저에서 0부터 컨텍스트 핸들의 매개 변수 번호를 제공합니다.
참고
형식 형식 문자열의 컨텍스트 핸들 설명에는 설명에 오프셋<2> 가 없습니다.
앞에서 설명한 것처럼 –Oif 헤더는 –Oi 헤더에서 확장됩니다. 편의를 위해 모든 필드가 여기에 표시됩니다.
(이전 헤더)
handle_type<1>
Oi_flags<1>
[rpc_flags<4>]
proc_num<2>
stack_size<2>
[explicit_handle_description<>]
( –Oif 확장)
constant_client_buffer_size<2>
constant_server_buffer_size<2>
INTERPRETER_OPT_FLAGS<1>
number_of_params<1>
constant_client_buffer_size<2> 는 컴파일러에서 미리 계산할 수 있는 마샬링 버퍼의 크기를 제공합니다. ClientMustSize 플래그가 크기 조정을 트리거하므로 이 크기는 부분 크기일 수 있습니다.
constant_server_buffer_size<2> 는 컴파일러에서 미리 계산한 대로 마샬링 버퍼의 크기를 제공합니다. ServerMustSize 플래그가 크기 조정을 트리거하므로 이 크기는 부분 크기일 수 있습니다.
INTERPRETER_OPT_FLAGS Ndrtypes.h에 정의되어 있습니다.
typedef struct
{
unsigned char ServerMustSize : 1; // 0x01
unsigned char ClientMustSize : 1; // 0x02
unsigned char HasReturn : 1; // 0x04
unsigned char HasPipes : 1; // 0x08
unsigned char Unused : 1;
unsigned char HasAsyncUuid : 1; // 0x20
unsigned char HasExtensions : 1; // 0x40
unsigned char HasAsyncHandle : 1; // 0x80
} INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS;
- 서버가 버퍼 크기 조정 단계를 수행해야 하는 경우 ServerMustSize 비트가 설정됩니다.
- 클라이언트가 버퍼 크기 조정 단계를 수행해야 하는 경우 ClientMustSize 비트가 설정됩니다.
- 프로시저에 반환 값이 있는 경우 HasReturn 비트가 설정됩니다.
- 파이프 패키지를 사용하여 파이프 인수를 지원해야 하는 경우 HasPipes 비트가 설정됩니다.
- 프로시저가 비동기 DCOM 프로시저인 경우 HasAsyncUuid 비트가 설정됩니다.
- HasExtensions 비트는 Windows 2000 이상 확장이 사용됨을 나타냅니다.
- HasAsyncHandle 비트는 비동기 RPC 프로시저를 나타냅니다.
HasAsyncHandle 비트는 처음에 비동기 지원의 다른 DCOM 구현에 사용되었으므로 DCOM의 현재 스타일 비동기 지원에 사용할 수 없습니다. HasAsyncUuid 비트는 현재 이를 나타냅니다.