CSDN博客

img hahu

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

发表于2004/7/11 3:06:00  2854人阅读

分类: 编程综合 VC++

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 0

相关博文

我的热门文章

img
取 消
img