字符串类型转换总结
这里总结了BSTR, _bstr_t, CComBSTR, CString四种字符串类型之间的转换。其中BSTR为基本数据类型,另三个为字符串类。
首先声明四个类型的变量:
BSTR strBigBSTR = ::SysAllocString( _T( "BSTR" ));
_bstr_t strSmallBSTR( _T( “_bstr_t” )) ;
CComBSTR strCComBSTR( _T( “CComBSTR” ))
CString strCString( _T( “CString” ));
CComBSTR strTempCComBSTR( _T( “TempCComBSTR” ));
1. BSTR to Other Type
BSTR转换为其他类型非常方便,直接使用类的构造函数即可
// BSTR to _bstr_t
strSmallBSTR = _bstr_t( strBigBSTR );
// BSTR to CComBSTR
strCComBSTR = CComBSTR( strBigBSTR );
// BSTR to CString
strCString = CString( strBigBSTR );
2. _bstr_t to Other Type
基本思想是先把_bstr_t转化为TCHAR*, 再转化为其他类型。
// _bstr_t to BSTR
strTempCComBSTR = CComBSTR( static_cast<TCHAR*>( strSmallBSTR ));
strBigBSTR = strTempCComBSTR.m_str;
// _bstr_t to CComBSTR
strCComBSTR = CComBSTR( static_cast<TCHAR*>( strSmallBSTR ));
// _bstr_t to CString
strCString = CString( static_cast<TCHAR*>( strSmallBSTR ));
_bstr_t类重载了操作符char*和wchar_t*(TCHAR*的两种形式),所以这里并不是使用强制转换,而是调用了_bstr_t的函数。
3. CComBSTR to Other Type
基本思想是使用CComBSTR的公有成员变量m_str进行转换。
// CComBSTR to BSTR
strBigBSTR = strCComBSTR.m_str;
// CComBSTR to _bstr_t
strSmallBSTR = _bstr_t( strCComBSTR.m_str );
// CComBSTR to CString
strCString = CString( strCComBSTR.m_str );
4. CString to Other Type
基本思想是先把CString转化为LPCTSTR, 再转化为其他类型。
// CString to BSTR
strTempCComBSTR = CComBSTR( static_cast<LPCTSTR>( strCString ));
strBigBSTR = strTempCComBSTR.m_str;
// CString to _bstr_t
strSmallBSTR = _bstr_t( static_cast<LPCTSTR>( strCString ));
// CString to CComBSTR
strCComBSTR = CComBSTR( static_cast<LPCTSTR>( strCString ));
CString类重载了操作符LPCTSTR,所以这里并不是使用强制转换,而是调用了CString的函数。
5. 注意事项:
其他类型转化为BSTR类型时都使用的CComBSTR作为中转,因为这样不需要自己释放内存。但是要注意的是,转换后BSTR指向的是CComBSTR的内存,所以一旦CComBSTR被销毁了,BSTR也就失效了,这样会导致不可预知的错误。所以一定要保证CComBSTR大于或等于BSTR的周期。
下面用法是错误的:
strBigBSTR = CComBSTR(( LPCTSTR )strCString ).m_str;
因为CComBSTR在此条语句结束后就被析构了。