매개 변수 설명자
앞에서 설명한 것처럼 –Oi 및 –Oif 스타일 매개 변수 설명자가 있습니다.
–Oi 매개 변수 설명자
완전히 해석된 스텁에는 RPC 호출의 각 매개 변수에 대한 추가 정보가 필요합니다. 프로시저의 매개 변수 설명은 프로시저에 대한 설명 직후에 따릅니다.
매개 변수 설명자
[in] 또는 반환 단순 형식 매개 변수에 대한 설명의 형식은 다음과 같습니다.
FC_IN_PARAM_BASETYPE
simple_type<1>
-또는-
FC_RETURN_PARAM_BASETYPE
simple_type<1>
여기서 simple_type<1> 은 단순 형식을 나타내는 FC 토큰입니다. 코드는 다음과 같습니다.
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
기타 –Oi
매개 변수 설명자
다른 모든 매개 변수 형식에 대한 설명의 형식은 다음과 같습니다.
param_direction<1>
stack_size<1>
type_offset<2>
여기서 이러한 각 설명에 대한 param_direction<1> 필드는 다음 표에 표시된 필드 중 하나여야 합니다.
Hex | 플래그 | 의미 |
---|---|---|
4d | FC_IN_PARAM | in 매개 변수입니다. |
50 | FC_IN_OUT_PARAM | in/out 매개 변수입니다. |
51 | FC_OUT_PARAM | out 매개 변수입니다. |
52 | FC_RETURN_PARAM | 프로시저 반환 값입니다. |
4f | FC_IN_PARAM_NO_FREE_INST | 해제가 이루어지지 않는 매개 변수인 xmit/rep의 입니다. |
stack_size<1> 은 스택에서 매개 변수가 차지하는 정수 수로 표현되는 스택의 매개 변수 크기입니다.
참고
–Oi 모드는 64비트 플랫폼에서 지원되지 않습니다.
type_offset<2> 필드는 형식 형식 문자열 테이블의 오프셋으로, 인수의 형식 설명자를 나타냅니다.
–Oif 매개 변수 설명자
매개 변수 설명에는 두 가지 가능한 형식이 있습니다. 하나는 기본 형식이고 다른 형식은 다른 형식입니다.
기본 형식:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
기타:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
두 stack_offset<2> 에서는 가상 인수 스택의 오프셋(바이트)을 나타냅니다. 기본 형식의 경우 인수 형식은 형식에 해당하는 형식 문자로 직접 지정됩니다. 다른 형식의 경우 type_offset<2> 필드는 인수의 형식 설명자가 있는 형식 형식 문자열 테이블의 오프셋을 제공합니다.
매개 변수 특성 필드는 다음과 같이 정의됩니다.
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- MustSize 비트는 매개 변수 크기를 조정해야 하는 경우에만 설정됩니다.
- 서버가 매개 변수의 NdrFree* 루틴을 호출해야 하는 경우 MustFree 비트가 설정됩니다.
- IsSimpleRef 비트는 다른 포인터 이외의 다른 포인터에 대한 참조 포인터이고 할당 특성이 없는 매개 변수에 대해 설정됩니다. 이러한 형식의 경우 기본 형식에 대한 참조 포인터를 제외하고 매개 변수 설명의 type_offset<> 필드는 참조 형식에 대한 오프셋을 제공합니다. 참조 포인터는 건너뛰기만 하면 됩니다.
- IsDontCallFreeInst 비트는 자유 instance 루틴을 호출해서는 안 되는 특정 represent_as 매개 변수에 대해 설정됩니다.
- 매개 변수가 포인터에 대한 [out], [in] 또는 [in,out] 포인터이거나 열거형16에 대한 포인터인 경우 ServerAllocSize 비트는 0이 아니고 I_RpcAllocate 호출을 사용하는 대신 서버 인터프리터 스택에서 초기화됩니다. 0이 아닌 경우 이 값에 8을 곱하여 매개 변수의 바이트 수를 가져옵니다. 이렇게 하면 포인터에 대해 항상 8바이트 이상이 할당됩니다.
- IsBasetype 비트는 기본 –Oif 인터프리터 루프에 의해 마샬링되는 단순 형식에 대해 설정됩니다. 특히 범위 특성이 있는 단순 형식은 FC_RANGE 토큰을 사용하여 디스패치를 통해 범위 루틴 마샬링을 강제로 적용하기 위해 기본 형식으로 플래그가 지정되지 않습니다.
- IsByValue 비트는 값으로 전송되는 복합 형식에 대해 설정되지만 인수가 포인터인지 여부에 관계없이 단순 형식에 대해서는 설정되지 않습니다. 설정된 복합 형식은 구조체, 공용 구조체, transmit_as, represent_as, wire_marshal 및 SAFEARRAY입니다. 일반적으로 비트는 –Oicf 인터프리터에서 기본 인터프리터 루프의 이점을 위해 도입되어 비심플 인수(복합 형식 인수라고 함)가 제대로 역참조되도록 합니다. 이 비트는 이전 버전의 인터프리터에서 사용되지 않았습니다.