BSTR,LPSTR转换的问题[2004年4月26日 9:21]

BSTRLPSTR转换的问题

BSTR bstr;

LPSTR lpStr;

直接把他们两个转换过来

bstr = (BSTR)lpStr;

lpStr = (LPSTR)bstr;

看起来似乎很有道理,经过操作发现这种其实是错的。他们都是一种数据类型,虽然看起来都是字符串,但是和把整数硬性转换成字符串应该没什么差别。考虑其中,比较主要的应该是内存方式不一样的。LPSTRMSDN中的解释是以’/0’结尾的字符串指针,应该就是和

char pStr[]=”hello”;产生的字符串一样的。BSTR是用来在COM之间传值的,有特殊的一套内存管理方法,MSDN中示范使用方法如下:

·                BSTR bstrStatus = ::SysAllocString( L"Some text" );
·          ::SysFreeString( bstrStatus );

当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。相同的意思,实现一个返回BSTR的函数时,就不用管释放内存的东西了。

再说到BSTRLPSTR转换的问题上

如果bstr = (BSTR)lpStr; (当然bstr = lpStr;编译器会提示错误),返回的bstr将是无法识别的,但是,即使是成功的,设了断点,在这时候看WATCH窗口也是看不出来,如何看,后面再说。

如果lpStr = (LPSTR)bstr;如果bstr有值,lpStr能看到的也就是bstr的第一个字符(在调试窗口看)。

BSTRLPSTR之间正确转换的方法是用BSTR的封装类_bstr_t

_bstr_t的类里面有这样的操作重载。真是惭愧,不久前才知道这些也可以重载的,一直都以为就+,-,*,/能够重载。

operator const wchar_t*( ) const throw( );

operator wchar_t*( ) const throw( );

operator const char*( ) const throw( _com_error );

operator char*( ) const throw( _com_error );

再加上_bstr_t的构造函数允许,于是,就可以有解了。

LPSTR lpStr = (LPSTR)_bstr_t(bstr);      //LPSTR应该是用char*的操作符。

BSTR bstr = _bstr_t(lpStr);       

//这个我就不解了到底这个是怎么的呢,在不同一个类型之间转换,竟然也不会有警告,也不用操作符重载,上面确实没看到。看一下_bstr_t的源代码,还是不清不楚,有空再说。

反正,上面那样是对的。

BSTR里面有没有值,直接无法看出来,就可以用_bstr_t了。看来_bstr_t还挺有用的。

另外,又想到VARIANT 里面也有个BSTR bstrVal;如果函数返回的是bstrVal不知道这个要不要用::SysFreeString来释放呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值