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

原创 2004年07月11日 03:06:00

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来释放呢?

BSTR、LPSTR和LPWSTR  

 一、   BSTR、LPSTR和LPWSTR   在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。之所以出现类似上述的...
  • bichenggui
  • bichenggui
  • 2009年09月16日 17:09
  • 2926

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换【转】

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换VC++2010-09-25 21:23:12阅读457评论3  字号:大中小 订阅一.CString与LPCWSTR ...
  • sl159
  • sl159
  • 2011年05月11日 15:49
  • 30692

VC++中什么是BSTR、LPSTR以及LPWSTR

BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocStri...
  • lw001x
  • lw001x
  • 2013年02月04日 17:21
  • 1573

VC++中什么是BSTR、LPSTR以及LPWSTR

BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocStri...
  • lw001x
  • lw001x
  • 2013年02月04日 17:21
  • 1573

VC中常用的数据类型之间的转换string/LPCTSTR/LPSTR/VARIANT等

CString LPCTSTR区别联系  CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。 CS...
  • KingCat666
  • KingCat666
  • 2015年08月25日 10:10
  • 2503

LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

LPCTSTR,LPCSTR,LPTSTR,LPSTR的区别 LPCSTR     32-bit   指针,指向一个常量字串    LPSTR        32-bit   指针,指向一个字串 ...
  • phenixyf
  • phenixyf
  • 2015年01月23日 16:45
  • 2023

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换以及CString和LPCTSTR的关系

一.CString与LPCWSTR      两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的...
  • shuaiqidiudiu
  • shuaiqidiudiu
  • 2013年08月06日 08:38
  • 1514

几种字符集与LPTSTR、LPCSTR、LPSTR、LPCTSTR、LPWSTR、LPCWSTR的意义

1、几种字符集: 所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组。字符类型有三种编码格式: SBCS: 第一种是单字节字符集(single byte char...
  • yibo_ge
  • yibo_ge
  • 2016年04月04日 22:03
  • 888

在C++中如何将ActiveX控件所使用的BSTR数据转换成CHAR字符数组?

在C++中如何将ActiveX控件所使用的BSTR数据转换成CHAR字符数组?   BSTR类型是COM中使用的标准字符串类型。它其实是一个32位指针,保存字符串首字符的地址。        在C++...
  • luengyong
  • luengyong
  • 2013年12月11日 10:45
  • 985

Unicode编码下CString、char*、BSTR相互转换,char*、wchar_t*相互转换

更多精彩内容,请见:http://www.16boke.com 1、Unicode编码下CString转为char* 方法一:使用API:WideCharToMultiByte进行转换 #inclu...
  • one_in_one
  • one_in_one
  • 2014年05月20日 10:30
  • 5631
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BSTR,LPSTR转换的问题[2004年4月26日 9:21]
举报原因:
原因补充:

(最多只允许输入30个字)