如何在TWaveFormatExtensible中声明联合名? Delphi 7

问题描述 投票:0回答:1

我正在尝试定义TWaveFormatExtensible类型,但是不确定我是否正确地执行了Union类型声明。

type TWAVEFORMATEX = record
  wFormatTag: word;
  nChannels: LongWord;
  nSamplesPerSec: word;
  nAvgBytesPerSec: LongWord;
  nBlockAlign: word;
  wBitsPerSample: word;
  cbSize: word;
end;
type TWaveFormatExtensible = record
  Format: TWAVEFORMATEX;
  dwChannelMask: LongWord;
  SubFormat: integer;
  case Word of
    0: (wValidBitsPerSample: Word;);
    1: (wSamplesPerBlock: Word;);
    2: (wReserved: Word;);
end;

在C ++文档中:WAVEFORMATEXTENSIBLE使用联合样本类型。您将如何建议更正代码?如何将“样本”联合名称传递给声明?

delphi winapi delphi-7
1个回答
2
投票

结构的字段必须与原始(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: LongWord;
  SubFormat: integer;   
end;
© www.soinside.com 2019 - 2024. All rights reserved.