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

77

调用以A字符结尾的Win32 API函数与调用以W字符结尾的函数有什么区别?

我知道A代表ASCII编码,W代表宽字符或Unicode编码,但输出或输入的差异在哪里?

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

换句话说,我如何知道字符串的编码是ASCII还是UNICODE?必须根据我调用的函数版本AW来确定吗?对吗?

我找到了这个问题,但我认为它没有回答我的问题。

1个回答

91

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


16
还有一件需要记住的事情是,所有作为参数传递的结构体都有A版本和W版本。例如,RegisterClassExA接受一个WNDCLASSEXA结构体,其中使用ANSI LPCSTRs,而W版本使用LPCWSTRs。这会防止您将WCHARs传递给A版本,反之亦然。如果尝试这样做,编译器会报告类型不匹配的错误。一个相当常见的初学者错误是使用转换来使错误“消失”,而不是更改代码以使用正确的类型而无需强制转换。 - BrendanMcK
7
大致意思是:非 A/W 函数是作为预处理器宏实现的,它们映射到相应的 A/W 函数。它们不会调用 A/W 函数,而是在预处理阶段被替换成它们,具体取决于是否定义了“UNICODE”。因此,例如,如果定义了“UNICODE”,对“GetVolumeInformation()”的调用将被替换为对“GetVolumeInformationW()”的调用,否则将被替换为对“GetVolumeInformationA()”的调用。 - Remy Lebeau
2
那个宏替换“特性”真的很烦人。如果你有自己的类函数叫做GetVolumeInformation,它会被静默地重命名为GetVolumeInformationA或者GetVolumeInformationW。使用IDE查找定义将会带你到宏定义处,而不是函数。 - Mark Ransom
2
@MarkRansom 是的,这都是因为微软不愿意跟上时代,不支持C++的正确用法,比如使用函数重载和/或模板函数,而不是预处理器。 - Remy Lebeau
2
@Shayan 我回答中的链接以及之前的评论解释了 A/W 语义。这些也适用于 ExA/ExW 函数,它们通常只是早期 A/W 函数的 "Ex" 扩展版本。 - Remy Lebeau
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接