ATL中的字符串

 ATL中有不少让人看着就晕的字符串类型,对于java,.net程序员来说c++的字符串就是麻烦
尤其是一个库一个字符串类型
当然com也是这样,一堆奇怪的字符串类型,用过com的人一看这个就晕,一不小心就crash,
今天我们就来看看这个com中的字符串有多麻烦

要说字符串当然首推BSTR
它是什么,看看它怎么定义的
typedef /* [wire_marshal] */ OLECHAR *BSTR;
明显是OLECHAR *
OLECHAR是什么
typedef WCHAR OLECHAR;
呵呵,就是WCHAR
没有什么奇妙的,就是一个WCHAR数组

它是怎么产生的?
明显不能直接生成?
要使用SysAllocString()。这个方法会计算字符串的长度并设置足够的缓存
明显这个东西是在堆上分配的内存,不是在栈上

重新分配这个字符串
SysReAllocString(&bstrName, L"Mr. Slate");

SysStringLen()可以计算字符串的长度

在堆上分配的对象一定要delete的,但是不能简单的delete,这个是c++的
东西,但com是跨平台的。要释放内存一定要用
SysFreeString()

如果要自己出来这个字符串非常麻烦,当然要用CComBSTR
operator=  就可以自己初始化一个CComBSTR
这个BSTR将被重新分配

Length()
ByteLength()
这两个将返回字符串的长度和byte数

Copy()
CopyTo()
明显是把CComBSTR中的数据copy一份给返回。

!操作符,
当CComBSTR中的m_str是NULL的就是true  if(!bstr)  就是说它为NULL,那么if(bstr)就是说它不为空

AssignBSTR
是bstr再分配,如果里面的bstr和参数一样就不管了,如果不等就用参数重新分配。

ToLower()
ToUpper()
是将字符串大写化或是小写化

operator+=
可以直接执行字符串合并的工作

Append
当参数是CComBSTR的时候,直接AppendBSTR
当参数是LPCOLESTR的时候,它会将参数copy到bstr之后,并在末尾加个NULL

它还有一些字符串的比较,和一般的比较一样<>==

基本就这么多,看来它还是太简单了,比起什么CString啊 boost啊,它基本不行,但如果只是处理下com的函数它还是够用的

关键是
inline CComBSTR::~CComBSTR() throw()
 {
  ::SysFreeString(m_str);
 }
明白了吧,
它安全啊,不会泄漏的,呵呵,这是唯一的好处。
用它就是为了安全
而且
operator BSTR 是可以用这个强制转换BSTR,这样可以直接用它来代替BSTR
operator&     是可以直接得到BSTR*,这也是可以直接用于COM函数的

over,今天就这样,没上班,就少写点

你可能感兴趣的:(delete,null,crash,跨平台,byte,.net)