2012-11-10 10 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 unionのパスカル同等物は、variant recordとして知られています。

レコードタイプは、場合 文のように見えた、バリアント部分を持つことができます。バリアントパートは、レコード の宣言の他のフィールドに従わなければなりません。

は、以下の構文を使用し、変異体の一部とレコードタイプを宣言するには: - 予約語まで 場合 -

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

宣言の最初の部分と同じである 標準レコードタイプです。 宣言の残りの部分は、の場合からオプションの最終セミコロンに - と呼ばれます。変形部分では、

  • タグは任意であり、任意の有効な識別子であることができます。 タグを省略した場合は、コロン(:)も省略してください。
  • ordinalTypeは、序数タイプを示します。
  • constantListは、タイプordinalTypeの値、またはそのような定数のコンマ区切りリストを示す定数です。 は、の定数リストに複数回代入することはできません。タイプ レコードタイプの主要部分で構造:
  • バリアント

  • フィールドリストに似た宣言のセミコロンで区切られたリストです。つまり、バリアントの形式は次のとおりです。

    fieldList1:type1; ... fieldListn:typen;

フィールドリストは 識別子の有効な識別子またはカンマ区切りのリストであり、各タイプは、タイプを示し、最後のセミコロンは 任意です。タイプは、長い文字列、動的配列、バリアント (Variant型)、またはインターフェイスであってはならず、長い文字列、動的配列、バリアント、または インターフェイスを含むタイプ の型にすることはできません。しかし、これらのタイプへのポインタになることがあります。

変形パーツを持つレコードは構文的には複雑ですが、意味的には単純に がシンプルにシンプルです。レコードのバリアント部分には、メモリ内の同じスペースを共有する複数のバリアントが含まれています( )。任意のバリアントの任意のフィールドにいつでもまたは を書き込むことができます。ただし、あるバリアントの フィールドに書き込んだり、別のバリアントのフィールドに書き込んだりすると、 が自分のデータを上書きすることがあります。タグがある場合は、 レコードの非変形部分に という余分なフィールド(タイプordinalType)が機能します。残りについては


、それはかなりルーチンです:LONGLONGは、64ビットの整数であり、UCHARunsigned char、またはDelphiで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 Done。ありがとうございました。私はいつもそれによって混乱します! –

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:私の愚かな間違い...私は何らかの形で答えを編集しました... –

関連する問題