BSTR 数据类型

本文介绍了COM中用于处理字符串的特殊类型BSTR及其内存结构。详细解释了BSTR与LPOLESTR的区别及如何正确使用,同时列举了一系列用于创建、操作和释放BSTR的API函数和CString/CComBSTR类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


     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。


   各种字符串类型之间的转换

  1、函数 WideCharToMultiByte(),转换 UNICODE 到 MBCS。使用范例:

      LPCOLESTR lpw = L"Hello,你好";

      size_t wLen = wcslen( lpw ) + 1;  // 宽字符字符长度,+1表示包含字符串结束符

      

      int aLen=WideCharToMultiByte(  // 第一次调用,计算所需 MBCS 字符串字节长度

              CP_ACP,

              0,

              lpw,  // 宽字符串指针

              wLen, // 字符长度

              NULL,

              0,  // 参数0表示计算转换后的字符空间

              NULL,

              NULL);

       

      LPSTR lpa = new char [aLen];

       

      WideCharToMultiByte(

              CP_ACP,

              0,

              lpw,

              wLen,

              lpa,  // 转换后的字符串指针

              aLen, // 给出空间大小

              NULL,

              NULL);

 

      // 此时,lpa 中保存着转换后的 MBCS 字符串

      ... ... ... ...

      delete [] lpa;


    2、函数 MultiByteToWideChar(),转换 MBCS 到 UNICODE。使用范例:

      LPCSTR lpa = "Hello,你好";

      size_t aLen = strlen( lpa ) + 1;

      

      int wLen = MultiByteToWideChar(

              CP_ACP,

              0,

              lpa,

              aLen,

              NULL,

              0);

      

      LPOLESTR lpw = new WCHAR [wLen];

      MultiByteToWideChar(

              CP_ACP,

              0,

              lpa,

              aLen,

              lpw,

              wLen);

      ... ... ... ...

      delete [] lpw;


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值