我在看ATL internal这本书,在讲到BSTR时,说SysAllocString不能只能分配不含NULL结束付的的字符串,如果要在BSTR中保存含有NULL的字符窜,应该使用SysAllocStringLen.我就自己做了一下测试,发现第二个不能存入中间含有NULL的字符串呀!
BSTR str = ::SysAllocString(OLESTR("bac刘\0abc境外ie")); BSTR str2 = ::SysAllocStringLen(OLESTR("bac23刘\0境sd外ie"),100);

CComBSTR comStr(str), comStr2(str2); int strlen = comStr.Length();   //输出4
int str2len = comStr2.Length();  //输出6, 说明str2中只有\0前的字符。 ::SysFreeString(str);
::SysFreeString(str2); comStr = str2;
还有一个问题,就是我使用了SysFreeString释放了BSTR,但是为什么还能在最后一个语句使用这个str2能?
环境是VS2005

解决方案 »

  1.   

    CComBSTR::Length里面用的是SysStringLen,这个是需要\0就结束的。
    CComBSTR::ByteLength 得到的就是分配内存的长度
    SysFreeString之后str2 就是野指针了, 使用也指针就是你的错。指不定下一次会出啥问题。
      

  2.   


    int str2len3 = comStr2.ByteLength();
    针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据怎么保存包含Null字符的字符串到BSTR中?
      

  3.   


    BSTR str2 = ::SysAllocStringLen(OLESTR("bac23刘\0境sd外ie"),100); 这个不就是么,里面就保存了\0
      

  4.   


    我看了一下,str2中确实是保存了\0后面的字符串,但是没有办法获取str2中有效的字符串的长度!有没有办法?谢谢您 的回复!
      

  5.   

    既然\0不是结尾了,那就没办法知道你存的字符串结尾是什么有多长了,只能获取整个bytelength
    或者申请的时候就指定对应的bytelength
      

  6.   

    不是说BSTR中的第一个字符保存了字符串的长度吗?那个长度有办法获取吗?
      

  7.   

    不是字符串长度,而是BSTR占用了多少内存,就是之前说到的 ByteLength 。
    你得自己设定。