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
函数的“扩展”版本。