bstr是什么??

原创 2006年05月31日 20:37:00

呵呵,我想除了是数据类型什么都不是。

但BSTR到底是什么呢,今天没有活就拿来搞了一下,首先见了一个MFC工程,在里面定义了几句话如下:

 USES_CONVERSION;
 
   BSTR a = BSTR(CComBSTR("2233"));
 LPOLESTR b= A2OLE("aaaaaaaaqqqq2");
 从这几句话中我首相想搞清 BSTR与LPOLESTR有什么区别,看过VS6.0中定义的可能都会发现他们几乎没有什么区别,是不是有猫腻咱们跟跟

当运行完第一句后,我们看内存中是什么东东,从WATCH中可以看到a中的是刚2233(看来微软的东东并不是一无是处,呵呵)。某人总是告诉我们BSTR前面有四个字节表示BSTR的字节数,那么我们先不问他是怎么有四个字节的,看看某人说的是不是事实。好,我们在WATCH中输入*((int*)(((int*)a)-1)),这我就不用解释了,它的值果然是8。恩,果然是这样。那么我们继续向下执行,当执行完第二句后,用同样的我们可以看b的值和它前面的数(呵呵,不要笑话,我有点孤陋寡闻,没有听说LPOLESTR 前面也有四个字节)。哦,*((int*)(((int*)b )-1))=14,晕,字符串的长度是13,算上结尾占的位,正好是14。这是巧合?我在b中添加了几个字符如下:

LPOLESTR b= A2OLE("aaaaaaaaqqqq2ttyykk");如果上次不是偶然的话,这次应给是20,抓紧看看*((int*)(((int*)b )-1))=20,无奈了。怎么回事,难道LPOLESTR前面也有四个字节??这怎么可能,我紧接着定义了另一个变量LPOLESTR c= A2OLE("2222222222222222"),重新跟程序运行,当这行完此句之后,*((int*)(((int*)c )-1))=17,哇塞,难道LPOLESTR前面真有四个字节,他与BSTR唯一不同之处是代表的字符个数加上结尾空字符。不好,前面是什么?????

我晕,b的前四个字节变成了4194304(注,我的是64位处理器),它被什么覆盖了?我用b指针向后面跟发现,(b-1)[0]=64, (b-2)[0]= 0, (b-3)[0]=50, (b-4)[0]=50,而c[0]=50,c中的2ASIIC码是50,哦,b的前四个字节有两个字节被c的结尾空字符占去。另外一个不知道是什么,不过这已经可以说明LPOLESTR前面的字节可以覆盖,应给没有什么用。现在我们可以得出为什么LPOLESTR和BSTR定义相同,因为他们他们结构完全相同,哦哦哦哦,哈哈哈哈哈哈,明白一点了。

既然LPOLESTR前面的没有什么用,我们也不在追究了,得饶人处且饶人。就看看BSTR是不是能盖呢?

紧接着定义了两个变量:

BSTR d = BSTR(CComBSTR("4444442233"));

 BSTR e = BSTR(CComBSTR("rrrrrrrrrrrrrrrrrrrr"));

从WATCH上看到*((int*)(((int*)d)-1))=20;*((int*)(((int*)e)-1))=40;e并没有覆盖d,我们从CComBSTR中看到,它调用了sysallocstring(),问题就处在这,这个函数肯定作了什么见不得人得事,在看看所有BSTR得赋值都调用了这个函数,恩,可以肯定得说分配内存并赋值得动作都是它干得,恩,一切都明了化,这就是我们为什么要用这个函数的理由,要不然BSTR就不是BSTR了。我今天开始看ATL的时候上网看看他们两个的区别,看到很多说两个混用出现毛病的问题,想想那不出毛病才怪呢。

欧阳

 

 

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

更多精彩内容,请见:http://www.16boke.com 1、Unicode编码下CString转为char* 方法一:使用API:WideCharToMultiByte进行转换 #inclu...

类型转换总结(CString 、char*、int、float、_bstr_t、LPCWSTR、LPSTR)

1、CString转char* CString 头文件#include CString cstr; char *p = (LPSTR)(LPCTSTR)cstr; 2、CString转_bst...
  • lebao82
  • lebao82
  • 2012年08月24日 14:15
  • 3690

C++ 字符类型总结&CString ,BSTR ,LPCTSTR之间关系和区别

1.区别wchar_t,char,WCHAR   ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。   UNICO...

CString, BSTR, LPCTSTR之间得关系和区别

CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组...

_variant_t _bstr_t

_variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型, VARIANT和BSTR这两种类型是COM中使用的数据类型。 为了C++中的变量应用到A...

CString、string、char*、char[]、 _bstr_t互相转换操作

CString 头文件#include string 头文件#include CString 转char * CString cstr; char *p = (LPSTR)(LPCTSTR...

CString, BSTR, LPCTSTR 概念(转)

 CString是一个动态TCHAR数组, BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵 ) LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TC...
  • caok
  • caok
  • 2011年06月13日 15:22
  • 694

CString、_bstr_t、_variant_t等类型的相互转换

本文转载自http://blog.csdn.net/yyyzlf/article/details/5209934 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用...

ATL基础BSTR CComBSTR SysAllocString

ATL基础BSTR CComBSTR SysAllocString ATL提供了 BSTR 和 CComBSTR ,还有OLEAUTO32.DLL导出一个API叫SysAllocString。这...

CString, BSTR, LPCTSTR之间的关系和区别

CString是一个动态TCHAR数组,BSTR是一种专有式样的字符串(需要用系统提供的函数来支配,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组...
  • oemoon
  • oemoon
  • 2011年04月16日 15:28
  • 1001
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bstr是什么??
举报原因:
原因补充:

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