呵呵,我想除了是数据类型什么都不是。
但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的时候上网看看他们两个的区别,看到很多说两个混用出现毛病的问题,想想那不出毛病才怪呢。