Delphi中的CCHAR类型是什么?

时间:2012-11-10 14:32:46

标签: delphi

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中使用AnsiCharByte作为CCHAR等价物。

注意

JEDI Windows API的{p> JwaWinType.pasCCHAR声明为AnsiChar

2 个答案:

答案 0 :(得分:5)

它是一个字节,或者至少,它被用作1字节整数。在C中,字符可用于此目的。在Delphi中,如果没有类型转换,你就无法做到这一点。因此,您可以使用Char,但是您需要为其指定值'A'Chr(65)以指示65个字符的字符串。现在,那将是愚蠢的。 : - )

为了能够将其传递给API,它必须具有相同的大小。除此之外,被调用者甚至不知道它是如何声明的,因此将其声明为Delphi字节是最合理的解决方案。您找到的其他声明支持的选择。

答案 1 :(得分:4)

我认为对CCHAR的解释是错误的。 C前缀表示这是 count 字符,因此这可能是Microsoft在编写说明时完成的一个简单的复制粘贴错误。

它存储在一个字节中,用于计算一串字符的字节数。这些字符可能是宽字符,但CCHAR值仍会计算用于存储字符的字节数。

此类型的自然翻译为Byte。如果你将它编组为像AnsiChar这样的字符类型,你必须在使用之前将字符转换为整数值(例如一个字节)。