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_cast
...
::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
SomeMethod(static_cast
// void SomeMethod([in] BSTR )
_bstr_t bs2( static_cast
SomeMethod(static_cast
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
Wrong:
BSTR bstr1 = SysAllocString(L”ANSI string");
char *str = (char*) bstr1;
|