CComBSTR是封装了BSTR的一个类。
/*
class CComBSTR
{
public:
BSTR m_str;
}
*/
CComBSTR提供了A构造函数、B赋值操作、C获得内部BSTR方法、D连接、E大小写转换操作、F比较操作、G永久性操作等。
CComBSTR提供了8个构造函数、3个赋值操作方法、4个和内部BSTR有关的方法、9个连接方法、2个大小写转换方法、5个比较操作方法、2个永久性操作方法(写入和读取)。
相关代码操作说明我在如下代码里进行了注释:
//A.CComBSTR的8个构造函数
//1.默认构造函数,把m_str初始化为NUL
CComBSTR cbstr1;
LPCOLESTR myOleStr = L"Hello const OLE string";
//使用OLESTR宏可以获得正确的参数类型
LPCOLESTR myOleStrMacro = OLESTR("construct a correct string by olestr macro");
//2.常用构造函数,已NUL结尾的OLESTR构造
CComBSTR cbstr2(myOleStr);
//3.指定缓冲长度,不包括NUL结尾字符
CComBSTR cbstr3(64,myOleStr);
//4.指定缓冲长度n,并补足n个NUL
CComBSTR cbstr4(64);
//5.拷贝构造函数
CComBSTR cbstr5(cbstr4);
LPCSTR myCStr = "Hello const c string";
//6.使用C string构造CComBSTR
CComBSTR cbstr6(myCStr);
//7.使用C string构造指定长度n字符串,以NUL补足长度n
CComBSTR cbstr7(64,myCStr);
//8.把c风格的IID转换为字符串形式({...}形式)
CComBSTR cbstr8(IID_IUnknown);
//B.CComBSTR的3个赋值操作
//1.CComBSTR之间的operator=
cbstr8 = cbstr7;
//2.使用LPCOLESTR赋值
cbstr8 = myOleStr;
//3.使用LPCSTR赋值
cbstr8 = myCStr;
//C.4个获得内部BSTR的方法
//1.operator BSTR() const {return m_str;}
//注意如果使用取址(&)获得BSTR,我们并没有控制权,它还是归CComBSTR管理
BSTR myInnerBSTR = (BSTR)cbstr8;
//2.使用CopyTo获得内部BSTR的拷贝,我们完全拥用了BSTR的所有权,要自己负责释放
BSTR myCopyBSTR;
cbstr8.CopyTo(&myCopyBSTR);
//3.使用Detach方法,CComBSTR内部的BSTR将被释放
BSTR myDetachBSTR = cbstr8.Detach();
//4.Attach方法,把我们拥有所有权的BSTR交给CComBSTR管理
BSTR myAttachBSTR = SysAllocString(L"hello bstr");
cbstr8.Attach(myAttachBSTR);
//D.CComBSTR的连接
//1.连接上指定长度缓冲,并附加给定的LPCOLESTR
cbstr8.Append(myOleStr,32);
//2.连接给定的LPCOLESTR
cbstr8.Append(myOleStr);
//3.连接c string
cbstr8.Append(myCStr);
//4.连接一个c字符
cbstr8.Append('x');
//5.连接一个wchar_t
wchar_t wc = '测';
cbstr8.Append(wc);
//6.连接一个CComBSTR
cbstr8.Append(cbstr7);
//7.使用operator+连接CComBSTR
cbstr8 += cbstr7;
//8.连接BSTR
cbstr8.Append(myInnerBSTR);
//9连接给定的cstring
cbstr8.AppendBytes("hello world",32);
//E.大小写转换
cbstr8.ToLower();
cbstr8.ToUpper();
//F.比较操作
//1.NUL检查
if(!cbstr8)
{
//非空
}
//2.CComBSTR之间的比较
if (cbstr8 < cbstr7)
{
}
//3.CComBSTR和LPCSTR之间的比较
if (cbstr8 < myCStr)
{
}
//4.CComBSTR和LPCOLESTR之间的比较
if (cbstr8 < myOleStr)
{
}
//5.CComBSTR和LPOLESTR之间的比较
LPOLESTR myUncOleStr = L"hello ole str";
if (cbstr8 < myUncOleStr)
{
}
//G.永久性
IStream* istrm = NULL;
//1.写入流操作
cbstr8.WriteToStream(istrm);
//2.从流中读取操作
cbstr8.ReadFromStream(istrm);