Win32 API中的"A"和"W"函数有什么区别?

Que*_*ire 32 unicode winapi ascii

调用Win32 API函数有什么不同,该函数A的末尾附加了一个字符而不是W字符.

我知道它意味着ASCII和/ WIDE CHARACTER或Unicode,但输出或输入的区别是什么?

例如,如果我叫GetDefaultCommConfigA,将它填满我COMMCONFIG结构ASCII字符串,而不是WCHAR字符串?(反之亦然GetDefaultCommConfigW)

换句话说,我怎么知道编码字符串是什么,ASCII或UNICODE,它必须是由我调用该函数的版本A还是W?正确?

我发现了这个问题,但我不认为它回答了我的问题.

Rem*_*eau 39

这些A函数使用Ansi(非ASCII)字符串作为输入和输出,W函数使用Unicode字符串(NT4及更早版本的UCS-2,W2K及更高版本的UTF-16). 有关更多详细信息,请参阅MSDN.

  • +1 - 另外要记住的是,作为参数传递给它们的所有结构也都有A和W版本; 所以例如RegisterClassExA采用一个使用ANSI LPCSTR的WNDCLASSEXA,而W版本使用LPCWSTRs - 这会阻止你将WCHAR传递给A版本,反之亦然 - 如果你尝试,你会得到关于类型的编译错误匹配 - 一个相当常见的初学者错误是使用强制转换来使错误"消失"而不是更改代码以使用正确的类型而不进行强制转换. (7认同)
  • @yuquan 有点。非 A/W 函数作为映射到适当 A/W 函数的预处理器宏来实现。它们不会*调用*A/W 函数,而是在预处理器阶段被它们*替换*,具体取决于是否定义了“UNICODE”。因此,例如,如果定义了“UNICODE”,则对“GetVolumeInformation()”的调用将替换为对“GetVolumeInformationW()”的调用,否则将替换为对“GetVolumeInformationA()”的调用。 (5认同)
  • 宏替换“功能”确实很痛苦。如果您有自己的类函数,名为“GetVolumeInformation”,它将被自动重命名为“GetVolumeInformationA”或“GetVolumeInformationW”。使用 IDE 查找定义会将您带到宏定义,而不是函数。 (2认同)
  • @MarkRansom 是的,这一切都是因为 Microsoft 不会与时俱进并正确支持 C++,例如使用函数重载和/或模板函数而不是预处理器。 (2认同)
  • @Shayan 我的答案中的链接以及上面的早期评论解释了“A”/“W”语义。这些也适用于 `ExA`/`ExW` 函数,它们通常只是早期 `A`/`W` 函数的“Ex”版本。 (2认同)