【问题标题】:What is the difference between the `A` and `W` functions in the Win32 API?Win32 API 中的 `A` 和 `W` 函数有什么区别?
【发布时间】:2011-11-17 11:19:21
【问题描述】:

调用末尾附加A 字符与W 字符的Win32 API 函数有什么区别。

我知道这意味着 ASCIIWIDE CHARACTER 或 Unicode,但输出或输入有什么区别?

例如,如果我调用 GetDefaultCommConfigA,它会用 ASCII 字符串而不是 WCHAR 字符串填充我的 COMMCONFIG 结构吗? (GetDefaultCommConfigW 反之亦然)

换句话说,我怎么知道字符串的编码是什么,ASCII还是UNICODE,它必须是我调用AW的函数版本?对吗?

我找到了这个question,但我认为它不能回答我的问题。

【问题讨论】:

    标签: winapi unicode ascii


    【解决方案1】:

    A 函数使用 Ansi(不是 ASCII)字符串作为输入和输出,W 函数使用 Unicode 字符串(NT4 及更早版本上的 UCS-2,W2K 及更高版本上的 UTF-16)。 Refer to MSDN 了解更多详情。

    【讨论】:

    • +1 - 另外要记住的是,作为参数传递给它们的所有结构也有 A 和 W 版本;例如,RegisterClassExA 采用 WNDCLASSEXA,它使用 ANSI LPCSTR,而 W 版本使用 LPCWSTR - 这会阻止您将 WCHAR 传递给 A 版本,反之亦然 - 如果您尝试,您将收到关于类型不的编译器错误匹配 - 一个相当常见的初学者错误是使用强制转换使错误“消失”,而不是更改代码以使用正确的类型而不使用强制转换。
    • 没有“A”或“W”后缀的函数如何工作?说“GetVolumeInformation”函数,是调用GetVolumeInformationA还是GetVolumeInformationW?
    • @yuquan 之类的。非 A/W 函数被实现为映射到适当 A/W 函数的预处理器宏。它们不调用 A/W 函数,而是在预处理阶段被它们替换,这取决于UNICODE 是否被定义。因此,例如,如果定义了UNICODE,则对GetVolumeInformation() 的调用将替换为对GetVolumeInformationW() 的调用,否则将替换为对GetVolumeInformationA() 的调用。
    • 宏替换“功能”真的很痛苦。如果您有自己的名为GetVolumeInformation 的类函数,它将被静默地重命名为GetVolumeInformationAGetVolumeInformationW。使用 IDE 查找定义将带您到宏定义,而不是函数。
    • @Shayan 我的答案中的链接以及上面的早期 cmets 解释了 A/W 语义。这些也适用于ExA/ExW 函数,它们通常只是早期A/W 函数的“Ex”倾向版本。
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 2014-02-02
    • 2010-11-30
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多