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