【问题标题】:What is the CCHAR type equivalent in Delphi?Delphi 中等价的 CCHAR 类型是什么?
【发布时间】:2012-11-10 14:32:45
【问题描述】:

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 指定短文件名字符串的长度,以字节为单位。”

这句话让我觉得 CCHAR 等价于 Delphi 中的 Byte。另一个例子是SYSTEM_BASIC_INFORMATIONNumberOfProcessors 成员,它在winternl.h 中声明如下:

typedef struct _SYSTEM_BASIC_INFORMATION {
  BYTE Reserved1[24];
  PVOID Reserved2[4];
  CCHAR NumberOfProcessors;
}

再一次,CCHAR 类型似乎用于Byte 上下文,而不是AnsiChar 上下文。

现在,我很困惑,是在 Delphi 中使用 AnsiChar 还是 Byte 作为 CCHAR 等效项。

注意

JEDI Windows API 中的JwaWinType.pasCCHAR 声明为AnsiChar

【问题讨论】:

    标签: delphi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      这种类型的自然翻译是Byte。如果将其编组为 AnsiChar 之类的字符类型,则必须在使用之前将字符转换为整数值(例如字节)。

      【讨论】:

      • 你的答案和@GolezTrol 的答案值得接受,但我必须选择一个。总之非常感谢。 :-)
      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多