영어로 읽기

다음을 통해 공유


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> 필드의 위쪽 니블에 추가한 다음 증분에 해당하는 맞춤으로 정렬합니다.

Nonencapsulated 공용 구조체

캡슐화되지 않은 공용 구조체는 공용 구조체가 하나의 인수 또는 필드이고 스위치가 각각 다른 인수 또는 필드인 일반적인 상황입니다.

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<>