BYTE b[] = {0x01,0x02,0x03,0x04,0x3c,0xf7,0x00};
CString strTest = _("");
strTest.Format(_T("%s"),b);
BSTR bstr = strTest.AllocSysString();
工程使用的是多字节字符集。
strTest 的内存数据如下:
01 02 03 04 3c f7 00 ,应该说是正常的而bstr 的内存数据如下:01 00 02 00 03 00 04 00 3c 00 00 00 00 00也就是说,0xf7 被当做0x00处理了。很是不解。有什么方法可以使得bstr的内容和strTest保持一致么,至少变成宽字节,也不能把原来的内容改变啊。还请各位指点指点。
CString strTest = _("");
strTest.Format(_T("%s"),b);
BSTR bstr = strTest.AllocSysString();
工程使用的是多字节字符集。
strTest 的内存数据如下:
01 02 03 04 3c f7 00 ,应该说是正常的而bstr 的内存数据如下:01 00 02 00 03 00 04 00 3c 00 00 00 00 00也就是说,0xf7 被当做0x00处理了。很是不解。有什么方法可以使得bstr的内容和strTest保持一致么,至少变成宽字节,也不能把原来的内容改变啊。还请各位指点指点。
那我现在做了一个控件,需要给js调用,必须使用BSTR,需要在接口中返回这样一个BSTR,有什么好办法可以提供么?
这样说吧。我的控件接口
BSTR TestFun([IN]BSTR strData,[IN]strDataLen)
{
CString strRet = _T("");
/*经过处理的strData,赋值给strRet */
return strRet.AllocSysString();
}然后我测试这个接口的时候,就直接用CString s = m_ocx.TestFun(x1,x2);
这样和我刚开始说的情况一样,s的值变了,和strRet是不一样的,被处理过了。
CString ss(s);
这样呢?
如果不用BSTR,js调用的时候会报类型不匹配的啊。。
0xf7在转的时候可能丢失,因为这个字符在CP_ACP中可能是无效的,没有对应的字符
Multibytetowidechar的时候丢了
恩,是的。我现在已经确认是这个原因,请教一下,如果需要实现我这样的控件需求,这种接口需要怎么写?控件工程改成UNICODE就可以了么?
你要处理多字节没有的UNICODE编码,要么就一直以UNICODE的方式处理,要么就把工程改称UNICODE的。但是不可见字符还是没办法的,0xf7是值是F7键,只应该用来做功能控制的,不知道为什么你会传到字符串中。
谢谢一再关注啊,等我结贴一定会公平散分的。做的PKI方面的东西,涉及到这些字符很正常的哇。。呵呵
先将字符串主动转换为unicode的? 你这个转换不会和我一样丢失字符么。。?
不会丢。我给你转换代码BOOL MultiByteToUnicode(LPCSTR pInput, int nInput, LPTSTR pOutput, int& nOutput)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, pInput, -1, NULL, 0); if(nSize > nOutput)
return FALSE; nOutput = MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED, pInput, nInput, pOutput, nSize); return TRUE;
}
BYTE *pbyData = new BYTE[4 + 12];
memset(pbyData,0,16);
int nLen = 12;
memcpy(pbyData,&nLen,sizeof(int));
for(int i = 0;i<6;i++)
pbyData[4 + i*2] = b[i];
BSTR bstr = BSTR(pbyData + 4);
类似这样不知道行不行
您真的蛮有才的。呵呵。不过用SysAllocStringByteLen就可以搞定了。谢谢大家,结贴晚了,抱歉!