我对_bstr_t类的一点认识

zengkun100 2005-05-24 02:18:12
最近总是跟_bstr_t这个类打交道,昨天好好研究了一下这个类。
_bstr_t类的定义在COMUTIL.H中。在这个类的声明上方,有一行注释:
//////////////////////////////////////////////////////////////////////////////
//
// Wrapper class for BSTR
//
//////////////////////////////////////////////////////////////////////////////
说明这个类的用图是封装COM中最常用的BSTR类型。BSTR是COM中用来表示UNICODE编码的字符串。下的宏定义说明了BSTR的真正类型。
typedef unsigned short wchar_t
typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
不过BSTR类型并非是简单的一个指针,一个BSTR字符串的前面有4个字节的长度位,而且BSTR字符串的分配和释放也需要专门的API来执行。那么_bstr_t类是怎么封装(warp)了BSTR类型的呢?
_bstr_t类封装BSTR有趣的地方就是它的封装方式有点类似于智能指针,又有点像COM管理生存期的方式。
说它像智能指针,是因为智能指针通常都在内部维护了一个指针来指向指向任意的一种类型,当智能指针自己释放时,它的析构函数会释放掉内部指针所指的空间。在_bstr_t内部,定义了一个私有类Data_t,和一个私有的成员变量Data_t* m_Data,这就有些像智能指针的做法了。然而智能指针通常都是用模板来实现类型通用,_bstr_t通过定义私有类的方式实现了管理BSTR的专用性。
说它像COM的coclass,是因为Data_t类的两个成员函数AddRef()和Release(),而且这两个成员函数的实现使用的是和COM一样的方式:InterlockedIncrement和InterlockedDecrement。怎么样,是不是一看到它们就想起了COM?
_bstr_t把这两点结合起来的地方在它的几种函数中:构造函数,赋值函数,析构函数。
构造函数:
如果是通过拷贝构造函数的方式来生成对象,将需要调用_bstr_t类的_AddRef成员函数(注意不同于Data_t类的AddRef),将bstr_t类内部的m_Data指针指向的对象引用计数加1。如果是从字符串(char*和wchar_t*)来构造_bstr_t类的对象,会将内部的m_Data指针指向的对象引用计数初始化为1,当然要调用Data_t类的构造函数。就像在new一个coclass的时候在构造函数里初始化引用计数为1那样。
赋值函数:
每次赋值,都要改变内部的m_Data指针的值。所以每次赋值都需要调用_Free来将m_Data指针所指的对象的引用计数减1。当然,当引用计数减到0时,m_Data指针所指的对象也就析构了。然而,有个特殊的赋值函数,它的参数是_bstr_t类型。在这个函数内,需要将参数的m_Data指针指向的对象引用计数加1。注意函数内用到了参数的私有变量,因为参数的类型也是_bstr_t。
析构函数
简单地将m_Data指针指向的对象引用计数减1。
_bstr_t类维护内部m_Data指针的方式使用了COM的引用计数方式。_AddRef和_Free的调用就像COM的调用那样。这样即使是_bstr_t类的对象析构了,只要它内部的m_Data指针所指的对象引用计数不为0,那个m_Data指针所指的对象还是存在于内存中的。


希望大家把自己对_bstr_t类的认识也贴出来,供他人学习。还有就是希望大家指正我的认识中的错误的地方。
...全文
305 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
umbrella1984 2005-05-25
  • 打赏
  • 举报
回复
先收藏晚点看。。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧