描述:
CString text= "12343";
BSTR bstrText =text.AllocSysString();
text.Format("%s",(char *)bstrText);
::AfxMessageBox(text);
为什么 text变成 "1"了??只取到第一个字符
因为上面的 出问题了~~转化时只转了第一个字符~~~~
解决方案1:
(char*)(_bstr_t)bstrText
解决方案2:USES_CONVERSION;
解决方案3:
USES_CONVERSION;
text=OLE2T(bstrText);
text.Format("%s",(char *)bstrText);?
解决方案5:上面我不是说过了吗?宽字符要么用支持宽字符的函数,要么进行转换,ATL下有一堆宏用于这种转换,比如楼上说的W2A,这个ATL或COM书上肯定都会介绍的。
解决方案6:转化过程是对的,不过输出是错的,bstrText中已经是BSTR了。
解决方案7: CString text= "12343";
BSTR bstrText =text.AllocSysString();
text = W2A(bstrText);
(char *)bstrText
这种用法就是不对的,这正是C语言的传统弊病——任意的强制转换!
你上面的强制转换只是通过了编辑,运行的时候肯定得不到你想要的结果。宽字符就应该用宽字符函数来操作,比如你的bstrText,用wsprintf来打印才对。
像AfxMessageBox这些函数,看起来只有一个版,去可以操作两种字符,其实不然,这是因为MFC在后台使用的宏操作,其实根本就没有AfxMessageBox这个函数,只有AfxMessageBoxA和AfxMessageBoxW,是宏的运用让AfxMessageBox在编译的时候动态的变成了AfxMessageBoxA或AfxMessageBoxW
::MessageBoxW( 0 , text, 0 , 0);用这个输出
解决方案10: CString text= L"12343";
默认情况下text是ascii的,而BSTR是宽字符的,即1和2之间有0x0,而0是字符串的结束符。