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

    技术2022-05-11  82

    第二章 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智能指针类 一个智能指针类: 在类的析构函数执行时,释放封装在内部的接口指针; 在栈上分配的智能接口指针,在异常处理期间会自动地释放它的接口指针; 在赋值时, 在改写被封装的接口指针之前要释放它; 在赋值时, 对接收到的接口调用; 

    最新回复(0)