BSTR,LPSTR转换的问题
BSTR bstr;
LPSTR lpStr;
直接把他们两个转换过来
bstr = (BSTR)lpStr;
lpStr = (LPSTR)bstr;
看起来似乎很有道理,经过操作发现这种其实是错的。他们都是一种数据类型,虽然看起来都是字符串,但是和把整数硬性转换成字符串应该没什么差别。考虑其中,比较主要的应该是内存方式不一样的。LPSTR在MSDN中的解释是以’/0’结尾的字符串指针,应该就是和
char pStr[]=”hello”;产生的字符串一样的。BSTR是用来在COM之间传值的,有特殊的一套内存管理方法,MSDN中示范使用方法如下:
· BSTR bstrStatus = ::SysAllocString( L"Some text" );
· ::SysFreeString( bstrStatus );
当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。相同的意思,实现一个返回BSTR的函数时,就不用管释放内存的东西了。
再说到BSTR,LPSTR转换的问题上
如果bstr = (BSTR)lpStr; (当然bstr = lpStr;编译器会提示错误),返回的bstr将是无法识别的,但是,即使是成功的,设了断点,在这时候看WATCH窗口也是看不出来,如何看,后面再说。
如果lpStr = (LPSTR)bstr;如果bstr有值,lpStr能看到的也就是bstr的第一个字符(在调试窗口看)。
在BSTR,LPSTR之间正确转换的方法是用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来释放呢?