我正在尝试定义TWaveFormatExtensible
类型,但是不确定是否正确声明了Samples
联合。这是头文件(Windows SDK 10.0.17763.0)中的原始声明:
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample; /* bits of precision */
WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */
WORD wReserved; /* If neither applies, set to zero. */
} Samples;
DWORD dwChannelMask; /* which channels are */
/* present in stream */
GUID SubFormat;
}
这就是我尝试过的:
type
TWAVEFORMATEX = record
wFormatTag: Word;
nChannels: LongWord;
nSamplesPerSec: Word;
nAvgBytesPerSec: LongWord;
nBlockAlign: Word;
wBitsPerSample: Word;
cbSize: Word;
end;
TWaveFormatExtensible = record
Format: TWAVEFORMATEX;
dwChannelMask: LongWord;
SubFormat: Integer;
case Word of
0: (wValidBitsPerSample: Word;);
1: (wSamplesPerBlock: Word;);
2: (wReserved: Word;);
end;
但这是不正确的。一个人如何在Delphi的记录结构中声明一个并集?
答案 0 :(得分:11)
结构的字段必须与原始(C ++)声明中的顺序相同。但是有一个问题:原始声明将Samples
变体放在记录的中间,而Delphi不允许这样做。
您可以通过将变体部分声明为单独的记录,然后将该记录作为字段包含在最终结构中来解决此问题。
TWaveFormatExtensibleSamples = record
case Word of
0: (wValidBitsPerSample: Word;);
1: (wSamplesPerBlock: Word;);
2: (wReserved: Word;);
end;
然后构造最终结构:
TWaveFormatExtensible = record
Format: TWAVEFORMATEX;
Samples: TWaveFormatExtensibleSamples;
dwChannelMask: DWORD;
SubFormat: TGUID;
end;
编辑:带有不同部分的记录的文档,状态:
记录类型可以有一个变体部分,看起来像一个case语句。变体部分必须遵循记录声明中的其他字段。
这涉及没有随附记录声明的变体零件。
但是,正如Remy Lebeau指出的那样,带有变体部分的记录可以在其他字段之间的TWaveFormatExtensible
声明中直接声明为结构的一部分:
TWaveFormatExtensible = record
Format: TWAVEFORMATEX;
Samples: record
case Word of
0: (wValidBitsPerSample: Word;);
1: (wSamplesPerBlock: Word;);
2: (wReserved: Word;);
end;
dwChannelMask: DWORD;
SubFormat: TGUID;
end;
因此,它可以与单独声明的TWaveFormatExtensibleSamples
记录一起使用。