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

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_cast<LPCTSTR>bs;

...

::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<LPCTSTR>(str1));

SomeMethod(static_cast<BSTR> (bs1) );

 

// void SomeMethod([in] BSTR )

_bstr_t bs2( static_cast<LPCTSTR>(str1));

SomeMethod(static_cast<BSTR> (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 <const char*> 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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值