Win32函数原型分为普通、ANSI和Unicode三种。其实如果严格地说,并不能有普通这种分法,也就是只有ANSI和Unicode这两种。普通,一般都是MSDN开发文档中直接给出的形式。比如,下面是SetWindowText的普通原型:
BOOL SetWindowText(HWND hwnd, LPCTSTR lpText);
实际上,包含SetWindowText函数声明的头文件具体是用宏实现的:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
预处理程序会根据是否定义了UNICODE将宏进行替换,替换后的函数不是ANSI版本就是Unicode版本。函数末尾的“A”代表“ANSI”,而“W”代表“Wide”。头文件中也分别包含了两种不同版本的函数原型声明:
ANSI原型:
BOOL WINAPI SetWindowTextA(HWND hWnd, LPCSTR lpString);
Unicode原型:
BOOL WINAPI SetWindowTextW(HWND hWnd, LPCWSTR lpString);
下面是winuser.h头文件中SetWindowText函数的声明及宏定义:
WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
HWND hWnd,
LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
HWND hWnd,
LPCWSTR lpString);
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
注意,在使用字符串参数时,普通原型使用的是LPCTSTR,ANSI原型使用的是LPCSTR,而Unicode原型使用的是LPCWSTR。
我们通常在自己的程序中使用普通原型的函数,在需要的时候才定义UNICODE,此时将使用函数的Unicode版本。如果不定义UNICODE,则默认使用函数的ANSI版本。当然,我们也可以在调用函数时,直接显示地使用ANSI版本或Unicode版本,具体方法就是在普通原型的函数加上“A”或者“W”,但我不太提倡这样做,因为容易发生混淆。
这种方法通常应用在使用字符串参数的函数中,一般情况下都是按正常的方式使用。什么是正常的方式?正常人用的都是正常的方式,你是正常人吗?呵呵。由于VB中使用的是Unicode,所以在VB中使用时一定要注意,我想熟悉VB的人这一点都很清楚。以“W”结尾的函数中的字符串参数均使用wide-character,即我们通常情况下看到的一个英文字符或一个汉字用2个字节存储,而有的函数是仅有Unicode版本的。
MSDN开发文档中关于函数的说明部分都有一个QuickInfo,QuickInfo中会说明该函数是否同时含有ANSI版本和Unicode版本。
*-------------------------------------------*
* 转载请通知作者并注明出处,CSDN欢迎您! *
* 作者:卢培培(goodname008) *
* 邮箱:goodname008@163.com *
* 专栏:http://blog.csdn.net/goodname008 *
*-------------------------------------------*