系统的语言环境配置或该系统的键盘类型配置无论如何都会影响在内核级别调用哪个 API?具体来说,如果一个程序正在调用“CreateFile()”API,那么 Windows API 文档说明该调用被委托给 CreateFileA 或 CreateFileW。如果该程序正在中国的带有中文键盘的系统上运行,那么将调用这两个函数中的哪一个?
1 回答
Unicode 和 Locale 是两个完全正交的概念。
关于CreateFileA
vs CreateFileW
- 控制它的设置是编译时设置:如果应用程序被编译为使用 Unicode 字符集运行,CreateFileW
则将被调用,如果编译设置表明应用程序应编译为多字节应用程序,然后CreateFileA
将被调用。
如果您使用的是 Visual Studio C++,请检查应用程序的项目设置。在配置属性下,在名为“常规”的页面上将设置“字符集” - 这可以设置为“使用 Unicode 字符集”或“使用多字节字符集”。此设置的效果是自动将另一个属性表添加到解决方案 - 在属性管理器下可见:“Unicode 支持”属性表添加了预处理器定义“ _UNICODE,UNICODE
”-“多字节字符支持”属性表改为添加“_MBCS ”。
现在,如果您查看定义,CreateFile
您会发现它本身就是一个宏,并且当您构建应用程序时,CreateFile
代码中的所有调用都将解析为CreateFileW
如果UNICODE
已定义则CreateFileA
调用,否则调用。
UNICODE
用于windows.h
在 Windows API 调用的 Wide 和 Ansi 版本之间切换。
_MBCS
并被_UNICODE
Microsoft C 运行时标头(主要是 tchar.h)用于将 c 库从支持单字节切换到多字节再到支持该功能的 unicode 字符。