描述:
我在看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 就是野指针了, 使用也指针就是你的错。指不定下一次会出啥问题。