问津BSTR

简介:     COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。

    COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原则吗?COM 组件是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系统需要把这块内存的内容传递到“地球另一 边”的计算机上,因此,我至少需要知道你这块内存的尺寸吧?不然让我如何传递呀?传递多少字节呀?!而字符串又是非常常用的一种类型,因此 COM 设计者引入了 BASIC 中字符串类型的表示方式---BSTR。BSTR 其实是一个指针类型,它的内存结构是:(输入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");断点执行,然后观察p的内存)


图二、BSTR 内存结构

  BSTR 是一个指向 UNICODE 字符串的指针,且 BSTR 向前的4个字节中,使用DWORD保存着这个字符串的字节长度( 没有含字符串的结束符)。因此系统就能够正确处理并传送这个字符串到“地球另一 边”了。特别需要注意的是,由于BSTR的指针就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:
  有函数 fun(LPCOLESTR lp),则你调用 BSTR p=...; fun(p); 正确
  有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 错误!!!
有关 BSTR 的处理函数:
 

API 函数 说明
SysAllocString() 申请一个 BSTR 指针,并初始化为一个字符串
SysFreeString() 释放 BSTR 内存
SysAllocStringLen() 申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串
SysAllocStringByteLen() 申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串
SysReAllocStringLen() 重新申请 BSTR 指针

CString 函数

说明

AllocSysString() 从 CString 得到 BSTR
SetSysString() 重新申请 BSTR 指针,并复制到 CString 中

CComBSTR 函数

ATL 的 BSTR 包装类。在 atlbase.h 中定义

Append()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()
运算符重载:!,!=,==,<,>,&,+=,+,=,BSTR
    太多了,但从函数名称不能看出其基本功能。详细资料,查看MSDN 吧。另外,左侧函数,有很多是 ATL 7.0 提供的,VC6.0 下所带的 ATL 3.0 不支持。
    由于我们将来主要用 ATL 开发组件程序,因此使用 ATL 的 CComBSTR 为主。VC也提供了其它的包装类 _bstr_t。
目录
相关文章
|
7月前
|
人工智能 安全 算法
隐藏在我们身边的“科技引擎”,中兴服务器有多强?
隐藏在我们身边的“科技引擎”,中兴服务器有多强?
235 0
隐藏在我们身边的“科技引擎”,中兴服务器有多强?
|
存储 索引 Python
元组(Tuple)在Python编程中的应用与实例
元组(Tuple)在Python编程中的应用与实例
720 2
|
存储 前端开发 JavaScript
【五子棋实战】第5章 开发五子棋前端页面
页面设计原则   1、可配置性。比如棋盘的大小可配置,棋盘边长可配置,黑白空期的值可配置;   2、响应式。各种屏幕大小下棋盘的布局要合理;   3、面向对象。棋子、棋盘的定义都用类来封装,代码要写的好看。
380 0
|
编解码
VirtualBox安装虚拟机后分辨率调不对怎么办
VirtualBox安装虚拟机后分辨率调不对怎么办
912 0
|
并行计算 关系型数据库 数据库
|
C#
【WPF】使用Popup控件做浮窗/提示框
原文:【WPF】使用Popup控件做浮窗/提示框 需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作。 效果如下图: 当鼠标移入左上角的【多选显示】框内,出现下面的浮窗(悬浮在原UI之上)。
4771 0
|
消息中间件 缓存 网络协议
RabbitMQ消息确认
RabbitMQ消息确认
463 0
|
开发工具 iOS开发 容器
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(一)(2)
实战编程·使用SwiftUI从0到1完成一款iOS笔记App(一)
276 0
|
计算机视觉
kali不能联网-神奇ping不通之“相信科学”
kali不能联网-神奇ping不通之“相信科学”
475 0
|
应用服务中间件 Linux Shell
如何从docker镜像里提取dockerfile
hello,大家好,今天在玩docker的时候发现了很好用的东西,他就是用来提取镜像中的dockerfile的。这个是前者留下来的镜像,但是dockerfile被删除了,现在想知道dockerfile里面是如何写的,然后去查了查就有了新的发现——通过镜像来提取dockerfile,接下来我就把方法分享给大家。
687 0
如何从docker镜像里提取dockerfile

热门文章

最新文章