Windows编程中UNICODE和_UNICODE定义问题
初学Windows SDK编程时碰到过这个问题,UNICODE和_UNICODE并不是在头文件中“定义”的:
1、用代码定义的;
2、编译选项中指定。比如在VC2013中是:
所以你在头文件中找不到它的定义(注意是定义,不是使用,使用的地方则很多)。
但这两个符号对Windows程序却是有特定含义的,也就是说你不能将UNICODE定义为:Unicode,unicode,UseUnicode…否则毫无作用。因为在很多的头文件中,这两个符号用来判断:
在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?
LPCTSTR类型:
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串
- 详细释义:这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。
- ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。
//错误 6 error C2664: “int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)”: 无法将参数 2 从“const char
#ifdef UNICODE
#define lstrcpy lstrcpyW
#else
#define lstrcpy lstrcpyA //ANSI字符串
#endif // !UNICODE
- 当工程是Unicode编码时,_T将括号内的字符串以Unicode方式保存;当工程是多字节编码时,_T将括号内的字符串以ANSI方式保存
关键字“L”,则是不管编码环境是什么,都是将其后面的字符串以Unicode方式保存。
1、用THCAR代替char
- 2、字符串加_T(“”),如_T(“你好”)
- 3、用_tcscpy等代替strcpy等
- 4、ANSI操作函数以str开头,如strcpy(),strcat(),strlen();
- 6、Unicode操作函数以wcs开头,如wcscpy,wcscpy(),wcslen();
- 7、ANSI/Unicode互为兼容的操作函数以_tcs开头 _tcscpy(C运行期库);
- 8、ANSI/Unicode互为兼容的操作函数以lstr开头 lstrcpy(Windows函数);
- 9、考虑ANSI和Unicode的兼容,需要使用以_tcs开头或lstr开头的通用字符串操作函数。
最后加上头文件 #include