FILE_BOTH_DIR_INFORMATION结构的 ShortNameLength
成员声明如下:
typedef struct FILE_BOTH_DIR_INFORMATION {
...
CCHAR ShortNameLength;
...
};
从the explanation of CCHAR
type开始,CCHAR
是 8位Windows(ANSI)字符。所以,它相当于Delphi中的 AnsiChar
,对吧?但是,FILE_BOTH_DIR_INFORMATION
结构的ShortNameLength成员说明
“ShortNameLength
指定短文件名字符串的长度(以字节为单位)。”
该声明让我觉得Delphi中的 CCHAR
等价物是 Byte
。另一个例子是NumberOfProcessors
的 SYSTEM_BASIC_INFORMATION
成员,该成员在winternl.h
中声明如下:
typedef struct _SYSTEM_BASIC_INFORMATION {
BYTE Reserved1[24];
PVOID Reserved2[4];
CCHAR NumberOfProcessors;
}
CCHAR
类型似乎在Byte
上下文中使用,而不是AnsiChar
上下文。
现在,我很困惑,是否在Delphi中使用AnsiChar
或Byte
作为CCHAR
等价物。
JwaWinType.pas
将CCHAR
声明为AnsiChar
。
答案 0 :(得分:5)
它是一个字节,或者至少,它被用作1字节整数。在C中,字符可用于此目的。在Delphi中,如果没有类型转换,你就无法做到这一点。因此,您可以使用Char
,但是您需要为其指定值'A'
或Chr(65)
以指示65个字符的字符串。现在,那将是愚蠢的。 : - )
为了能够将其传递给API,它必须具有相同的大小。除此之外,被调用者甚至不知道它是如何声明的,因此将其声明为Delphi字节是最合理的解决方案。您找到的其他声明支持的选择。
答案 1 :(得分:4)
我认为对CCHAR
的解释是错误的。 C
前缀表示这是 count 字符,因此这可能是Microsoft在编写说明时完成的一个简单的复制粘贴错误。
它存储在一个字节中,用于计算一串字符的字节数。这些字符可能是宽字符,但CCHAR
值仍会计算用于存储字符的字节数。
此类型的自然翻译为Byte
。如果你将它编组为像AnsiChar
这样的字符类型,你必须在使用之前将字符转换为整数值(例如一个字节)。