Windows 给出的带有字符串参数的函数都有两个相同版本的函数与之对应,一个是 Unicode 版本,一个是 ANSI 版本,分别以 FunctionNameW 和 FunctionNameA 表示,FunctionName 实际上是一个宏定义。
用户在使用 FunctionNameA 版本的 ANSI 函数时,WIndows 内部会分配一块内存来将 ANSI 字符串转换为 Unicode 字符串,然后再调用 FunctionNameW 版本的 Unicode 函数,FunctionNameW 返回时,FunctionNameA 将释放申请的内存,又会将 Unicode 字符串转换回 ANSI 字符串。所以使用 ANSI 版本的例程会有性能损失。
某些 WIndows API 函数没有 Unicode 版本,如 WinExec 和 OpenFile,这些函数的存在是为了和之前的16位程序兼容,现在可以完成抛开这些函数而使用新的其它的 Unicode 函数。
所有 COM 接口方法必须使用 Unicode 字符串,因为 COM 通常用于不同组件之间的通信。
编译器会将所有的资源编译为 Unicode,如果应用程序没有定义 UNICODE 宏,系统会执行内部转换,将 Unicode 资源转换为 ANSI 资源。
C 运行时库使用的 Unicode 和 ANSI 函数
同 Windows 函数一样,C 运行时库也有 Unicode 和 ANSI 两个版本的函数,但是不象 Windows 函数,ANSI 版本的函数不会在内部将字符或字符串转换为 Unicode。
C 运行时库使用 _UNICODE 定义 Unicode 宏,常用 C 运行时字符操作库的定义可以参考 tch