2012-11-10 3 views
10
typedef struct _FILE_OBJECTID_INFORMATION { 
    LONGLONG FileReference; 
    UCHAR ObjectId[16]; 
    union { 
     struct { 
      UCHAR BirthVolumeId[16]; 
      UCHAR BirthObjectId[16]; 
      UCHAR DomainId[16]; 
     } DUMMYSTRUCTNAME; 
     UCHAR ExtendedInfo[48]; 
    } DUMMYUNIONNAME; 
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION; 

어떻게 이러한 유니온을 Delphi로 변환 할 수 있습니까?어떻게하면 C 공용체를 Delphi로 변환 할 수 있습니까?

답변

19

파스칼 등가물 C unionvariant record으로 알려져 있습니다.

레코드 유형

경우 문처럼 보이는 가변 부분을 가질 수 있습니다. 변형 된 부분은 레코드 선언의 다른 필드 뒤에 와야합니다.

다음 구문을 사용하여 변형 부분 레코드 타입을 선언 - 예약어까지 경우 -

type recordTypeName = record 
    fieldList1: type1; 
    ... 
    fieldListn: typen; 
case tag: ordinalType of 
    constantList1: (variant1); 
    ... 
    constantListn: (variantn); 
end; 

선언의 첫 번째 부분과 동일한 이고 표준 레코드 유형 선언의 나머지 부분 인 사례과 선택적 최종 세미콜론은 변종 파트라고합니다. 변형 부에서

  • 태그는 선택적이며 유효한 식별자 일 수있다. 태그을 생략하면 그 뒤에 콜론 (:)도 생략하십시오.
  • ordinalType은 서수 유형을 나타냅니다.
  • constantListordinalType 유형의 값 또는 이러한 상수의 쉼표로 구분 된 목록을 나타내는 상수입니다. 은 constantLists을 두 번 이상 나타낼 수 없습니다. 유형 레코드 타입의 주요 부분에서 구조 :
  • 변형

  • 를 Fieldlist을 닮은 선언의 세미콜론으로 구분 된 목록입니다. 즉, 변형은 다음 형식을 갖습니다.

    fieldList1 : type1; ... fieldListn : typen; 각 를 Fieldlist 유효한 식별자 또는 식별자 쉼표로 구분 된 목록

각 유형의 타입을 나타내며, 마지막 세미콜론 선택적이다. 유형은 긴 문자열, 동적 배열, 변형 (즉, 변형 유형) 또는 인터페이스가 아니어야하며 긴 문자열, 동적 배열, 변형 또는 인터페이스를 포함하는 유형으로 구조 할 수 없습니다. 그러나 이러한 유형에 대한 포인터가 될 수 있습니다.

변형 부품이있는 기록은 구문 적으로 복잡하지만 의미 상으로는 간단히 입니다. 레코드의 변형 부분에는 메모리에 동일한 공간을 공유하는 여러 변종 이 포함되어 있습니다.언제든지 언제든지 변형의 모든 입력란에 또는 글을 쓸 수 있습니다. 하지만 하나의 변형에서 필드에 쓰고 다른 변형에서 필드에 쓸 경우 은 자신의 데이터를 덮어 쓸 수 있습니다. 태그가있을 경우 레코드의 변형이 아닌 부분에 추가 필드 (ordinalType)의 추가 필드로 작동합니다. 나머지으로


, 그것은 꽤 루틴입니다 : LONGLONG는 64 비트 정수이며, UCHARunsigned char, 또는 델파이 AnsiChar입니다.

type 
    TFileObjectIDInformation = record 
    FileReference: Int64; 
    ObjectID: array[0..15] of AnsiChar; 
    case Integer of 
    0: 
     (
     BirthVolumeId: array[0..15] of AnsiChar; 
     BirthObjectId: array[0..15] of AnsiChar; 
     DomainId: array[0..15] of AnsiChar; 
    ); 
    1: 
     (ExtendedInfo: array[0..47] of AnsiChar); 
    end; 

그것은 ByteAnsiChar보다 더 적합 할 수 가능성이 있습니다. Pascal과 달리 C는 ByteAnsiChar에 대해 별도의 유형이 없기 때문에 물론 말할 수 없습니다. 그러나이 어레이들은 마치 텍스트로 읽혀 지듯이 내 생각에 내 생각에 AnsiChar이 더 적절할 것입니다.

+0

1) –

+0

@David_Heffernan, 감사합니다. – Astaroth

+0

@Astaroth 완료. 고맙습니다. 난 항상 그걸로 혼란스러워! –

4

유사 구조 JEDI API Lib에서 찾을 수 있습니다

"C 연합"의 설명에 대한
_FILE_OBJECTID_BUFFER = record 

    // 
    // This is the portion of the object id that is indexed. 
    // 

    ObjectId: array [0..15] of BYTE; 

    // 
    // This portion of the object id is not indexed, it's just 
    // some metadata for the user's benefit. 
    // 

    case Integer of 
     0: (
     BirthVolumeId: array [0..15] of BYTE; 
     BirthObjectId: array [0..15] of BYTE; 
     DomainId: array [0..15] of BYTE); 
     1: (
     ExtendedInfo: array [0..47] of BYTE); 
    end; 
+0

그건 다른 구조체입니다. 이름을보십시오. 구조체는 질문에서 찾을 수있는 첫 번째 필드가 없다는 점에서 다릅니다. –

+0

@DavidHeffernan : 내 바보 같은 실수 ... 나는 어떤 식 으로든 대답을 편집했다 ... –

관련 문제