词条 | _bstr_t |
释义 | _bstr_t类封装BSTR有趣的地方就是它的封装方式有点类似于智能指针,又有点像COM管理生存期的方式。_bstr_t将两者结合起来并具体体现在构造函数、赋值函数和析构函数中。 _variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型, VARIANT和BSTR这两种类型是COM中使用的数据类型。 为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。 通过_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了 ADO是基于COM接口x实现的。因此它的使用对于正在进行的 COMCOM编程的程序员而言更简单 COM是使用其特定的数据类型,_bstr_t是其中一种源类型 其他类型转换成_bstr_t可以直接赋值。 例子_bstr_t bstr(“程序员”); const char *buf=bstrVar; //不要修改buf中内容AfxMessageBox(buf); ////////////////////////////////////////////////////////////////////////////// // // 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类的认识也贴出来,供他人学习。还有就是希望大家指正我的认识中的错误的地方。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。