喵哥最近在写一个控制程序和被控制程序,脑子进水般的同时用了VS2013和VS2015,一个程序对应一个,最开始,两者都采用Unicode字符集,但是控制程序发出的指令不能被被控制程序接收,绞尽脑汁的思考,才想到可能是由于字符集的原因——因为在被控制程序接收指令的地方有这样一段代码:
/*****************接收ShellExecute的消息************************/
CString str;
for (int i = 1; i < __argc; i++) { str += __argv[i];}
/***************************设置INDEX以选择需要的相机**********************/
if (str == "openCamera1") CINDEX = 0;
else if (str == "openCamera2") CINDEX = 1;
else if (str == "openCamera3") CINDEX = 2;
else if (str == "openCamera4") CINDEX = 3;
else if (str == "openCamera5") CINDEX = 4;
else if (str == "openCamera6") CINDEX = 5;
可能是接收时,在这里出了问题(之前采用Unicode字符集,if语句里的字符串前有一个L,如L"openCamera1"),于是把字符集改成了多字节字符集,问题就得到解决了。
PS:对于字符的定义,Unicode下用wchar_t(#define wchar_t WHAR),多字符编码是char。在windows系统下,每套API都提供两套接口:1、xxA(.)为传统的多字符集;2、xxW(..)为Unicode字符集。根据VS项目设置的字符集,API可以自动调用相应的API。
TCHAR类型:自适应Unicode项目与多字符集项目
a)当VS项目设置为多字符集时,TCHAR被系统定义为char类型
b)当VS项目设置为Unicode时,TCHAR被系统定义为wchar_t类型
c)当VS项目设置为Unicode时,_TEXT(x)被系统定义为L(x)Unicode类型常量。
d)当VS项目设置为多字符集时,_TEXT(x)被系统定义为x多字符集类型常量。
e)使用_T或_TEXT时必须包含<tchar.h>,使用它来修饰字符串代码具有可移植性。
如:TCHAR *t = _T("abc");
char whar_t TCHAR之间相互转换可以采用T2A,W2A,A2W,A2T,使用前需要包含头文件:AtlBase.h,以及声明标识符 USES_CONVERSION;
另外,_bstr_t类((comutil.h))相对比较方便,可以随时存入和取出两种字符串,_bstr_t一般在MFC工程下使用。
例如: _bstr_t bstr = "abc";
bstr += L"中共";
char* p = bstr;
wchar_t *p2 = bstr;