《深入解析ATL》笔记(一)

第二章 ATL智能指针(第51页)
COM文本字符串是一个NULL结尾的OLECHAR字符数组,传递给COM接口方法的文本字符参数必须是LPOLECHAR类型,如果一个方法不改变这个字符串,那么这个参数类型应该是LPCOLECHAR
Windows字符数据类型:
Unicode: 固定字符大小。在C/C++使用wchar_t数组来表示宽字符串
MBCS/DBCS:多字节字符集是一种混合长度的字符集。C/C++中用unsigned char
ANSI 可以用 8位表示英语和很多西欧国家语言使用的所有字符。在C/C++中用char数组表示。在Visual C ++中的char 为 signed char。
TCHR/_TCHAR: 一个由Microsoft定义的通用文本数据类型。C运行库定义了_TCHAR类型,Windows操作系统定义了TCHAR。
WinAPI和字符串
每个需要字符串的Win32 API有两个版本:一个需要Unicode的参数,另一个需要MBCS参数。
COM使用两种字符类型:
OLECHAR: 对于Win32操作,这是wchar_t类型,对于Win 16操作系统, 这是char.
BSTR: 某些COM组件使用的特殊数据类型,BSTR是一个包含长度前缀的OLECHAR数组。
当源字符集和目标字符集不同并且目标类型是BSTR时, 这些宏使用了SysAllocString 和 SysAllocStringLen函数来分配目标字符串,必须用SysFreeString来释放这个BSTR
如把一个TCHAR字符串转换成BSTR时,
void Fun(LPTSTR lpsz)
{
   USES_CONVERSION;
    BSTR bstr = T2BSTR(lpsz);
    ::SysFreeString(bstr);
}
OLECHAE* ocscpy(LPOLESTR dest, LPCOLEBSTR src);
size_t ocslen(LPCOLESTR s);
OLESTR CharNextO(LPCOLESTR lp);
CComBSTR类是一个智能字符串类
CComVariant类是一个智能的VARINAT类
CComPtr和CComQIPt是智能指针类
COM定义了一种通用的文本数据类型 – OLECHAR
COM也定义了另一种文本数据类型 BSTR
2.3 CComBSTR类
 CComBSTR类是一个ATL工具类,它对COM字符串数据类型的封装,一个公有成员变量 BSTR m_str.
转换成小写
HRESULT  ToLower( )
{
   USES_CONVERSION;      //分配局部变量
   if (m_str != NULL)
{
   LPTSTR psz = CharLower(OLE2T(m_str));
   if (psz == NULL)
    return E_OUTOFMEMORY;
   BSTR b = T2BSTR(psz);
  if (b == NULL) return E_OUTOFMEMORY;
   SysFreeString(m_str);
   m_str = b;
   return S_OK;
}
CCOmBSTR对永久性的支持
提供从流中读出一个BSTR或把一个BSTR写入流中
HRSULT WirteToStream(IStream* pStream)
{
  ATLASSERT(pStream != NULL)
  ULONG cb;
 ULONG cbStrLen = m_str ? SysStringByteLen(m_str) + sizeof(OLECHAR) : 0;
HRESULT hr = pStream->Write((void*)&cbStrLen, sizeof(cbStrLen), &cb);
if (FAILED(hr)) return hr;
return cbStrLen ? pStream->Write((void*)&m_str, cbStrLen, &cb): S_OK;
}
从指定流中读出一个ULONG,申请一个BSTR,然后读入BSTR字符串中,注意CComBSTR对象必须是空的.
HRESULT ReadFromStream(IStream* pStream)
{
   ATLASSERT(pStream != NULL);
   ATLASSERT(m_str != NULL);
  ULONG cbStrLen = 0;
 HRESULT hr = pStream->Read((void*)&cbStrLen, sizeof(cbStrLen), NULL);
if ((hr == S_OK) && (cbStrLen != 0)
{
  m_str = SysAllocStringByteLen(NULL, cbStrLen - sizeof(OLECHAR));
if (m_str == NULL)
 hr = E_OUTOFMEMORY;
else hr = pStream->Read((void*)m_str, cbStrLen, NULL);
}
 if (hr == S_FALSE) hr = E_FAIL;
return hr;}
2.4 智能VARIANT类ComVarinat
调用者指定数据的格式和相应的值:
使用VARIANT之前必须用VariantInit初始化
使用VariantCopy来复制一个VARIANT
使用VariantClear来释放VARIANT
CComVarinat类是一个ATL工具类,封装COM自我描述数据类型
class CComVarinat : pulic tagVARIANT;
CComPtr、CComQIPtr和CComDispatchDriver智能指针类
一个智能指针类:
在类的析构函数执行时,释放封装在内部的接口指针;
在栈上分配的智能接口指针,在异常处理期间会自动地释放它的接口指针;
在赋值时, 在改写被封装的接口指针之前要释放它;
在赋值时, 对接收到的接口调用; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值