从零开发B/S机架应用程序(六)-由于字符集引发的惨案

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

猜你喜欢

转载自blog.csdn.net/osean_li/article/details/79768189