我在看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
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
CComBSTR::ByteLength 得到的就是分配内存的长度
SysFreeString之后str2 就是野指针了, 使用也指针就是你的错。指不定下一次会出啥问题。
int str2len3 = comStr2.ByteLength();
针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据怎么保存包含Null字符的字符串到BSTR中?
BSTR str2 = ::SysAllocStringLen(OLESTR("bac23刘\0境sd外ie"),100); 这个不就是么,里面就保存了\0
我看了一下,str2中确实是保存了\0后面的字符串,但是没有办法获取str2中有效的字符串的长度!有没有办法?谢谢您 的回复!
或者申请的时候就指定对应的bytelength
你得自己设定。