4字符串字符串和FourCC(又名OSType)值可以和平与和谐共存吗?

Fre*_*ing 5 delphi

我正在使用RIFFCHUNK结构,声明(在"外部"模块中)为(引用MMSystemDirectShow9):

  type FOURCC = DWORD;                    { a four character code }

  type _riffchunk = record
    fcc: FOURCC;
    cb: DWORD;
  end;
  type RIFFCHUNK = _riffchunk;
Run Code Online (Sandbox Code Playgroud)

我特别感兴趣的是fcc字段,这种类型可以解析为LongWord.另一方面,有意义的值fcc是由4个ASCII可打印单字节字符组成的字符串.我想避免以下丑陋(引用MMSystem):

  const FOURCC_RIFF = $46464952;   { 'RIFF' }
Run Code Online (Sandbox Code Playgroud)

...并使用实际的,自解释的四个字符串文字进行分配和比较.

到目前为止,我尝试了什么并被卡住了,如下所示:

const idRIFF: packed array [1..4] of AnsiChar = 'RIFF';
var Chunk: RIFFCHUNK;
begin
  Chunk.fcc := FOURCC(idRIFF);  { works, but requires a typecast in implementation }
Run Code Online (Sandbox Code Playgroud)

由于idRIFF不是真常数,因此不能用于正确输入符号的声明.

那么,我想问一下这个美化事件的进一步建议?

请注意什么FOURCC类型是"外来的",所以我不能将它重新声明为字符数组.

Arn*_*hez 2

你也可以写:

_riffchunk.fcc := PCardinal(PAnsiChar('RIFF'))^;
Run Code Online (Sandbox Code Playgroud)

是的,它有效!

这实际上与编写相同:

const
  FOURCC_RIFF: PAnsiChar = 'RIFF';
...
  _riffchunk.fcc := PCardinal(FOURCC_RIFF)^;
Run Code Online (Sandbox Code Playgroud)

因此,有了一个函数,你就有:

function ToFourCC(const s: AnsiString): FOURCC; inline;
begin
  result := PCardinal(s)^;
end;

_riffchunk.fcc := ToFourCC('RIFF');
Run Code Online (Sandbox Code Playgroud)

当然,这一切都不适用于 NextGen 编译器。