理解COM字符串数据类型BSTR 、CComBSTR类

理解COM字符串数据类型BSTR
 

BSTR是一种包含长度前缀的OLECHAR字符串。修正:它之所以这样是修修补补的结果

一、BSTR是一个指向包含长度前缀的OLECHAR字符数组的指针。

二、BSTR是一个指针数据类型,它指向数组的第一个字符,长度前缀以整数的形式存放在数组第一个字符前面

三、字符数组以NUL字符作为结尾。修正:这样做是为了和C兼容

四、长度前缀以字节为单位,而不是字符,并且不包括NUl中止符。

五、字符数组内部可以包含嵌入的NUL字符。修正:这样是为了和VB等兼容

六、它必须使用SysAllocString和SysFreeString函数族来分配和释放

七、NULL BSTR指针意味着一个空字符串。修正:BSTR bstr = NULL; 表示指针为空,和字符串为空无关,判断 BSTR 是否为空的标准是取得(SysStringLength)字符串前面的长度

八、BSTR没有引用计数,因此复制BSTR意味着字符串的拷贝,而不仅仅是字符串指针的复制。

CComBSTR类的构造函数
 

CComBSTR类是ATL对BSTR字符串的一个封装。

class CComBSTR

{

public:

BSTR m_str;

}

CComBSTR类有八个构造函数。

CComBSTR()//

       {//构建一个空的BSTR字符串

              m_str = NULL;

       }

/*explicit*/ CComBSTR(int nSize)

       {//构建一个nSize大小的未初始化的BSTR字符串

              m_str = ::SysAllocStringLen(NULL, nSize);

       }

/*explicit*/ CComBSTR(int nSize, LPCOLESTR sz)

       {//构建一个BSTR字符串,它从OLECHAR字符指针sz开始的nSize个字符

              m_str = ::SysAllocStringLen(sz, nSize);

       }

       /*explicit*/ CComBSTR(LPCOLESTR pSrc)

       {//构建一个用OLECHAR字符指针所指向的字符串初始化的BSTR字符串

              m_str = ::SysAllocString(pSrc);

       }

       /*explicit*/ CComBSTR(const CComBSTR& src)

       {//构建一个BSTR字符串从另一个CComBSTR对象

              m_str = src.Copy();

       }

       /*explicit*/ CComBSTR(REFGUID src)

       {//构建一个BSTR字符串,它接受一个GUID参数,并据此产生一个包含GUID字符的字符串,用于注册很方便

              LPOLESTR szGuid;

              StringFromCLSID(src, &szGuid);

              m_str = ::SysAllocString(szGuid);

              CoTaskMemFree(szGuid);

       }

CComBSTR类初始化函数
 

CComBSTR类初始化有三个函数。

CComBSTR& operator=(const CComBSTR& src)

       {//用另一个对象初始化

              if (m_str != src.m_str)

              {

                     if (m_str)

                            ::SysFreeString(m_str);

                     m_str = src.Copy();

              }

              return *this;

       }

       CComBSTR& operator=(LPCOLESTR pSrc)

       {//用一个OLECHAT字符指针初始化,这个方法需要注意,

//如果pSrc中内嵌了NULL字符,那么字符的初始化到NULL就截止了

              ::SysFreeString(m_str);

              m_str = ::SysAllocString(pSrc);

              return *this;

       }

CComBSTR& operator=(LPCSTR pSrc)

       {

              ::SysFreeString(m_str);

              m_str = A2WBSTR(pSrc);

              return *this;

       }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值