我正在使用RIFFCHUNK结构,声明(在"外部"模块中)为(引用MMSystem和DirectShow9):
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类型是"外来的",所以我不能将它重新声明为字符数组.
你也可以写:
_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 编译器。