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保持一致么,至少变成宽字节,也不能把原来的内容改变啊。还请各位指点指点。

解决方案 »

  1.   

    BSTR只能是UNICODE的,MBCS会被转换成UNICODE,你那个是正常的。
      

  2.   


    那我现在做了一个控件,需要给js调用,必须使用BSTR,需要在接口中返回这样一个BSTR,有什么好办法可以提供么?
      

  3.   

    BSTR是用来传字符串的,你就用CString的AllocSysString没有问题啊,返回的时候CString直接等就行了,有重载符号、拷贝构造函数进行转换的。不要用BSTR传二进制数据,它不是用来干这个的。
      

  4.   


    这样说吧。我的控件接口  
    BSTR TestFun([IN]BSTR strData,[IN]strDataLen)

      CString strRet = _T("");
      /*经过处理的strData,赋值给strRet */
      return strRet.AllocSysString();
    }然后我测试这个接口的时候,就直接用CString s = m_ocx.TestFun(x1,x2);
    这样和我刚开始说的情况一样,s的值变了,和strRet是不一样的,被处理过了。
      

  5.   

    CStringW s = m_ocx.TestFun(x1,x2);
    CString ss(s);
    这样呢?
      

  6.   


    如果不用BSTR,js调用的时候会报类型不匹配的啊。。
      

  7.   

    因为你的程序是多字节的,BSTR是UNICODE的,会转码,
    0xf7在转的时候可能丢失,因为这个字符在CP_ACP中可能是无效的,没有对应的字符
    Multibytetowidechar的时候丢了
      

  8.   


    恩,是的。我现在已经确认是这个原因,请教一下,如果需要实现我这样的控件需求,这种接口需要怎么写?控件工程改成UNICODE就可以了么?
      

  9.   

    还有,返回的BSTR你自己要释放内存的
      

  10.   


    你要处理多字节没有的UNICODE编码,要么就一直以UNICODE的方式处理,要么就把工程改称UNICODE的。但是不可见字符还是没办法的,0xf7是值是F7键,只应该用来做功能控制的,不知道为什么你会传到字符串中。
      

  11.   

    晕 我最近在做如此的问题,我的做法是在返回值前 先将字符串主动转换为unicode的。然后赋值给局部变量CStringW,最后通过CStringW. AllocSysString返回BSTR给上层。这样不就搞定了
      

  12.   


    谢谢一再关注啊,等我结贴一定会公平散分的。做的PKI方面的东西,涉及到这些字符很正常的哇。。呵呵
      

  13.   


    先将字符串主动转换为unicode的?  你这个转换不会和我一样丢失字符么。。?
      

  14.   

    不合法字符根本无法进行字符串转换,既然有特殊字符,就不要把它当做字符串来处理。解决办法取决于你的实际需求,如果只是个别特殊字符,可以预先把这些字符转换成可见字符,例如 1234F7,把0XF7转换成F7两个字符,这样就能整体转换成字符串,当然接收方也必须识别F7;如果有大量的特殊字符,就只能当做字节流来处理,用 SysAllocStringByteLen分配内存,不过JS处理字节稍微麻烦一些
      

  15.   


    不会丢。我给你转换代码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;
    }
      

  16.   

    BYTE b[] = {0x01,0x02,0x03,0x04,0x3c,0xf7,0x00};
    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);
    类似这样不知道行不行
      

  17.   


    您真的蛮有才的。呵呵。不过用SysAllocStringByteLen就可以搞定了。谢谢大家,结贴晚了,抱歉!
      

  18.   

    采用 comutil单里面的 _bstr_t 会比较容易...而且功能非常强大...