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

Winapi Win32 API中的'A'和'W'函数有什么区别?,winapi,unicode,ascii,Winapi,Unicode,Ascii,调用结尾附加了A字符的Win32 API函数与调用W字符有什么区别 我知道它的意思是ASCII和WIDE CHARACTER或Unicode,但输出和输入有什么区别 例如,如果我调用GetDefaultCommConfigA,它会用ASCII字符串而不是WCHAR字符串填充我的COMMCONFIG结构吗?(对于GetDefaultCommConfigW,反之亦然) 换句话说,我如何知道字符串的编码是ASCII还是UNICODE,它必须是由我调用的函数A或W的版本决定的?对吗 我发现了这一点,但我

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

我知道它的意思是
ASCII
WIDE CHARACTER
或Unicode,但输出和输入有什么区别

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

换句话说,我如何知道字符串的编码是ASCII还是UNICODE,它必须是由我调用的函数
A
W
的版本决定的?对吗


我发现了这一点,但我不认为它回答了我的问题。

函数使用Ansi(非ASCII)字符串作为输入和输出,
W
函数使用Unicode字符串(NT4和更早版本上的UCS-2,W2K和更高版本上的UTF-16)。了解更多详细信息。

+1-另一件需要记住的事情是,作为参数传递给这些对象的所有结构也有A和W版本;例如,RegisterClassExA使用WNDCLASSXA,它使用ANSI LPCSTR,而W版本使用LPCWSTRs-这会阻止您将WCHAR传递给a版本,反之亦然-如果您尝试,您将得到一个关于类型不匹配的编译器错误-一个相当常见的初学者错误是使用强制转换使错误“消失”而不是将代码更改为使用正确的类型而不使用强制转换。没有“a”或“W”后缀的函数如何工作?如果说“GetVolumeInformation”函数,它会调用GetVolumeInformation还是GetVolumeInformation?比如说@yuquan。非A/W函数作为映射到相应A/W函数的预处理器宏实现。它们不调用A/W函数,而是在预处理器阶段用它们替换,具体取决于是否定义了
UNICODE
。因此,例如,如果定义了
UNICODE
,那么对
GetVolumeInformation()
的调用将替换为对
GetVolumeInformationW()
的调用,否则将替换为对
GetVolumeInformationA()
的调用。宏替换“功能”是一个真正的难题。如果您有自己的名为
GetVolumeInformation
的类函数,它将以静默方式重命名为
GetVolumeInformationA
GetVolumeInformationW
。使用IDE查找定义将带您到宏定义,而不是函数。@Shayan我回答中的链接和上面的早期注释解释了
A
/
W
语义。这些函数也适用于
ExA
/
ExW
函数,它们通常只是早期
A
/
W
函数的“扩展”版本。