RPC 공용 구조체
캡슐화된 공용 구조체와 캡슐화되지 않은 공용 구조체는 모두 공통 union_arm_selector<> 형식을 공유합니다.
union_arms<2>
arm1_case_value<4> offset_to_arm_description<2>
..
armN_case_value<4> offset_to_arm_description<2>
default_arm_description<2>
union_arms<2> 필드는 두 부분으로 구성됩니다. 공용 구조체가 MIDL 1.0 스타일 공용 구조체인 경우 위쪽 4비트에는 공용 구조체 암의 맞춤(가장 큰 정렬된 팔 맞춤)이 포함됩니다. 그렇지 않으면 상위 4비트 가 0입니다. 하위 12비트에는 공용 구조체의 무기 수가 포함됩니다. 다시 말하면,
alignment<highest nibble> arm_counter<three lower nibbles>
offset_to_arm_description<2> 필드에는 arm의 형식 설명에 대한 상대 서명된 오프셋이 포함됩니다. 그러나 필드는 단순 형식에 대한 최적화로 오버로드됩니다. 이러한 경우 이 오프셋 필드의 위쪽 바이트는 FC_MAGIC_UNION_BYTE(0x80)이고 짧은 바이트의 하위 바이트는 arm의 실제 형식 문자 형식입니다. 따라서 오프셋 값에는 두 가지 범위가 있습니다. "80 xx"는 xx 가 형식 형식 문자열임을 의미합니다. 및 범위 내의 다른 모든 항목(80 FF .. 7f FF)은 실제 오프셋을 의미합니다. 이렇게 하면 80 00 .범위 <의 오프셋이 만들어집니다. 오프셋으로 80 FF > 를 사용할 수 없습니다. 컴파일러는 MIDL 버전 5.1.164부터 이를 확인합니다.
default_arm_description<2> 필드는 기본 arm(있는 경우)의 공용 구조체 암 유형을 나타냅니다. 공용 구조체에 대해 지정된 기본 arm이 없으면 default_arm_description<2> 필드가 0xFFFF switch_is 값이 arm 사례 값과 일치하지 않으면 예외가 발생합니다. 기본 arm이 지정되었지만 비어 있으면 default_arm_description<2> 필드는 0입니다. 그렇지 않으면 default_arm_description<2> 필드에는 offset_to_arm_description<2> 필드와 동일한 의미 체계가 있습니다.
요약은 다음과 같습니다.
- 0 - 빈 기본값
- FFFF - 기본값 없음
- 80xx - 단순 형식
- 기타 - 상대 오프셋
캡슐화된 공용 구조체는 IDL의 특수 공용 구조체 구문에서 가져옵니다. 실제로 캡슐화된 공용 구조체는 구조체의 시작 부분에 비범죄 필드가 있는 번들 구조체이고 다른 멤버는 공용 구조체뿐입니다.
FC_ENCAPSULATED_UNION switch_type<1>
memory_size<2>
union_arm_selector<>
캡슐화된 공용 구조체의 switch_type<1> 필드에는 두 부분이 있습니다. 아래쪽 니블은 실제 스위치 형식을 제공하며, 위쪽 니블은 스텁 생성 구조의 switch_is() 필드와 실제 공용 구조체 필드 사이의 패딩을 포함하는 switch_is 필드를 건너뛰기 위해 메모리 포인터를 증가시켜야 하는 크기인 스텝오버할 메모리 증분을 제공합니다.
memory_size<2> 필드는 공용 구조체의 크기일 뿐이며 캡슐화되지 않은 공용 구조체와 동일합니다. 합집합이 포함된 구조체의 총 크기를 가져오려면 메모리 증분에 memory_size<2> 를 추가하여 단계별로, 즉 switch_type<1> 필드의 위쪽 니블에 추가한 다음 증분에 해당하는 맞춤으로 정렬합니다.
캡슐화되지 않은 공용 구조체는 공용 구조체가 하나의 인수 또는 필드이고 스위치가 각각 다른 인수 또는 필드인 일반적인 상황입니다.
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
위치:
switch_type<1> 필드는 비범죄자의 형식 문자입니다.
switch_is_descriptor<> 필드는 상관 관계 설명자이며 /strong 사용 여부에 따라 4바이트 또는 6바이트입니다. 그러나 switch_is_description<> 경우 공용 구조체가 구조체에 포함된 경우 switch_is_description<> 오프셋 필드는 구조체의 시작이 아닌 구조체의 공용 구조체 위치에서 switch_is 필드로의 오프셋입니다.
offset_to_size_and_arm_description<2> 필드는 공용 구조체의 크기와 팔 설명에 대한 오프셋을 제공합니다. 이 설명은 캡슐화된 공용 구조체의 경우와 동일하며 동일한 형식의 모든 캡슐화되지 않은 공용 구조체에서 공유됩니다.
memory_size<2>
union_arm_selector<>