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

欧阳

 

 

文件流的基础主要涉及计算机存储、数据传输和处理等多个方面的原理。 从存储角度来看,文件是以二进制数据的形式存储在磁盘等存储设备上的。文件流就是对这些二进制数据进行有序的读取和写入操作,将文件数据从存储设备传输到内存或其他目标位置。 在数据传输方面,文件流技术允许数据以流的形式进行发送和接收,按需读取和发送文件数据,而不是一次性加载整个文件,从而降低了内存占用和网络带宽的压力,还支持边读取边传输,提高了文件传输的效率[^1]。 在程序处理上,通过文件流可以对文件进行各种操作,如读取、写入、修改等。在前端开发中,有多种方式处理文件流,例如使用 `axios` 请求下载文件(后端返回 `Blob` 文件流),可以设置 `responseType` 为 `'blob'` 来处理文件流数据[^3]。 ```javascript // axios设置reponseType的方式应该类似下面 const url = '/info/download'; // get、delete、head 等请求 axios.get(url, {params: {}, responseType: 'blob'}) .then((res) => {}) .catch((err) => {}); // post、put、patch 等请求 axios.post(url, {...params}, {responseType: 'blob'}) .then((res) => {}) .catch((err) => {}); ``` 此外,前端还可以进行文件流的转换,如将 `base64` 字符串转换为文件或文件流 `blob` [^2]。 ```javascript /** * base64 转成 file 或者 blob * @param str {String} base64 字符串 * @param fileName {String} 自定义的文件名 */ function base64ToFile(str, fileName) { let arr = str.split(','); let mime = arr[0].match(/:(.*?);/)[1]; let bStr = atob(arr[1]); let n = bStr.length; let u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bStr.charCodeAt(n); } return new File([u8arr], fileName, { type: mime }); // file // return new Blob([u8arr], { type: mime }); // blob } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值