BSTR内存结构

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


BSTR
是一个指向UNICODE 字符串的指针,BSTR前的4个字节中,使用DWORD保存着这个字符串的字节长度(没有含字符串的结束符)。因此系统就能够正确处理并传送这个字符串到地球另一边了。特别需要注意的是,由于BSTR的指针就是指向UNICODE 串,因此BSTRLPOLESTR可以在一定程度上混用,但一定要注意:
有函数 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()
运算符重载:!,!=,==,<,>,&,+=,+,=

太多了,但从函数名称不能看出其基本功能。详细资料,查看MSDN 吧。另外,左侧函数,有很多是 ATL 7.0 提供的,VC6.0 下所带的 ATL 3.0 不支持。
由于我们将来主要用ATL开发组件程序,因此使用ATL CComBSTR 为主。VC也提供了其它的包装类_bstr_t

你可能感兴趣的:(api,basic,fun)