关于在BSTR中存入字符串的问题

txwd0033 2011-01-06 10:40:25
我在看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
...全文
86 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
txwd0033 2011-01-06
  • 打赏
  • 举报
回复
不是说BSTR中的第一个字符保存了字符串的长度吗?那个长度有办法获取吗?
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 txwd0033 的回复:]

引用 3 楼 akirya 的回复:

引用 2 楼 txwd0033 的回复:
int str2len3 = comStr2.ByteLength();
针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据

怎么保存包含Null字符的字符串到BSTR中?


BSTR str2 = ::SysAllocStringLen(OLESTR……
[/Quote]
既然\0不是结尾了,那就没办法知道你存的字符串结尾是什么有多长了,只能获取整个bytelength
或者申请的时候就指定对应的bytelength
txwd0033 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 akirya 的回复:]

引用 2 楼 txwd0033 的回复:
int str2len3 = comStr2.ByteLength();
针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据

怎么保存包含Null字符的字符串到BSTR中?


BSTR str2 = ::SysAllocStringLen(OLESTR("bac23刘\0境sd外ie"),100……
[/Quote]

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

谢谢您 的回复!
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 txwd0033 的回复:]
int str2len3 = comStr2.ByteLength();
针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据

怎么保存包含Null字符的字符串到BSTR中?
[/Quote]

BSTR str2 = ::SysAllocStringLen(OLESTR("bac23刘\0境sd外ie"),100); 这个不就是么,里面就保存了\0
txwd0033 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]

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

int str2len3 = comStr2.ByteLength();
针对于你说的第二个,我测试了一下,这个长度是12,也就是comStr2中只保存了\0前的数据

怎么保存包含Null字符的字符串到BSTR中?
  • 打赏
  • 举报
回复
CComBSTR::Length里面用的是SysStringLen,这个是需要\0就结束的。
CComBSTR::ByteLength 得到的就是分配内存的长度
SysFreeString之后str2 就是野指针了, 使用也指针就是你的错。指不定下一次会出啥问题。
txwd0033 2011-01-06
  • 打赏
  • 举报
回复
非常感谢大神帮忙
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 txwd0033 的回复:]

不是说BSTR中的第一个字符保存了字符串的长度吗?那个长度有办法获取吗?
[/Quote]
不是字符串长度,而是BSTR占用了多少内存,就是之前说到的 ByteLength 。
你得自己设定。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧