flyman

opengl world
随笔 - 10, 文章 - 0, 评论 - 65, 引用 - 0
数据加载中……

BSTR是什么

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

但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的时候上网看看他们两个的区别,看到很多说两个混用出现毛病的问题,想想那不出毛病才怪呢。

posted on 2007-05-14 20:38 flyman 阅读(3935) 评论(3)  编辑 收藏 引用

评论

# re: BSTR是什么  回复  更多评论   

通常写com的时候都会用到

# re: BSTR是什么  回复  更多评论   

那么 BSTR 是否等于 wchat_t呢?
2009-04-03 02:32 | softg

# re: BSTR是什么  回复  更多评论   

//BSTR 的格式
//
union XBSTR
{
int len; //字节数
wchar_t n_ch; //字符
short tail;//结束符
};

//BSTR 的验证
//
void test_bstr_fmt()
{
char *p = new char[10];

//4个字节
//
p[0] = 4; //int型 保存的是字节数
p[1] = 0;
p[2] = 0;
p[3] = 0;

//wchar_t L'a' 的表示
//
p[4] = 'a'; //wchar_t是short型 两个字节 低位存储在低地址
p[5] = 0; //高位存储在高地址

//wchar_t L'b' 的表示
//
p[6] = 'b';
p[7] = 0;

p[8] = 0;
p[9] = 0;

char *s = &p[4];
BSTR bstr = (BSTR)s;

cout << "ab: " << SysStringLen(bstr) << endl;
}
2009-08-17 16:01 | air

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理