BSTR详解五 - BSTR与其它字符串类型转换

1         类型转换
常用字符串件的类型转换。
 
From
To
Sample
字符串常量
BSTR
Right:
BSTR bs = ::SysAllocString(_T("Test string"));
::SysFreeString();
Wrong:
BSTR bs = _T("Test string"); //ERROR
LPWSTR /
LPCWSTR /
WCHAR* /
wchar_t
BSTR
Right:
LPCTSTR sz1 = _T("Test String");
BSTR bs = ::SysAllocString(sz1);
::SysFreeString();
 
Wrong:
LPTSTR sz1 = _T("Test String");
BSTR bs = sz1; //ERROR
BSTR
LPCWSTR /
const WCHAR * /
const wchar_t *
Right:
BSTR bs = ...; //
...
LPCTSTR sz = static_castbs;
...
::SysFreeString(bs);
//Never use sz after this line
 
Wrong:
BSTR bs = ...; //
...
 
LPCTSTR sz = bs;
...
::SysFreeString(bs);
//Never use sz after this line
_tcslen(sz); //ERROR
 
BSTR
LPWSTR /
WCHAR* /
wchar_t*
Right:
BSTR bs = ...; //
//...
UINT len = ::SysStringLen(bs);
 
// Do not modify the BSTR content by
// C/C++ string functions
LPTSTR sz = new TCHAR[len+1];
_tcsncpy(sz, bs, len);
::SysFreeString(bs);
 
delete []sz;
Wrong:
BSTR bs = ...; //
//...
 
// Do not modify the BSTR content by
// C/C++ string functions
LPTSTR sz = bs; //Error
 
CString
BSTR
Right:
 
CString str1 = ...;
 
BSTR bs = str1.AllocSysString();
SomeMethod(bs);
// void SomeMethod([in]BSTR)
::SysFreeString(bs);
 
CComBSTR bs1(static_cast(str1));
SomeMethod(static_cast (bs1) );
 
// void SomeMethod([in] BSTR )
_bstr_t bs2( static_cast(str1));
SomeMethod(static_cast (bs2) );
 
Wrong:
CString str1 = ...;
 
SomeMethod(str1.AllocSysString());
 
// No one will releasee the return BSTR of
// str1.AllocSysString()
 
BSTR
CString
Right:
 
BSTR bs = SysAllocString(_T(“Test”));
CString str1(bs);
CString str2;
Str2 = bs;
SysFreeString(bs); // Never forget this line
char* / LPSTR / LPCSTR
BSTR
Right:
Solution 1
char str[MAX_STR_LEN] = "ANSI string";
WCHAR wstr[MAX_WSTR_LEN];
// Convert ANSI to Unicode
 
MultiByteToWideChar( CP_ACP, 0, str,
        strlen(str)+1, wstr,  
     sizeof(wstr)/sizeof(wstr[0]) );
 
BSTR bs1 = ::SysAllocString(wstr);
 
CString cs = str;
BSTR bs2 = cs. AllocSysString()
 
Solution 2
char str[MAX_STR_LEN] = "ANSI string";
_bstr_t bs1(str);
CComBSTR bs2(str);
 
Wrong:
char *str = "ANSI string";
BSTR bstr1 = SysAllocString(
            (const OLECHAR*) str);
BSTR
char* / LPSTR / LPCSTR
Right:
Solution 1
char str[MAX_STR_LEN];
BSTR bs = ::SysAllocString(L"Test");
// Convert ANSI to Unicode
WideCharToMultiByte( CP_ACP, 0,
   (LPCWSTR)bs, -1,
   str, MAX_STR_LEN, NULL, NULL );
::SysFreeString(bs);
 
Solution 2
BSTR bs = ::SysAllocString(L"Test");
_bstr_t bs1(bs, false);
const char* str = static_cast bs1;
 
Wrong:
BSTR bstr1 = SysAllocString(L”ANSI string");
char *str = (char*) bstr1;    
 
IMPORTANT: 上面所有的例子都是按照 UNICODE 应用程序设计的。并且不考虑 BSTR 中包含多个字串的情况,也就是 BSTR 只在结束的位置有一个 0 结束符。对于 MBCS/ANSI 程序,可以参考上面的例子。主要区别是对于现在的 COM 版本 OLECHAR wchar_t ,但是 TCHAR  对于 UNICODE 程序才是 wchar_t
 

你可能感兴趣的:(C/C++)