BSTR詳解五 BSTR與其它字串型別轉換

2021-04-29 00:30:44 字數 3431 閱讀 7537

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。

BSTR詳解三 BSTR使用注意事項

1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 malloc,free,new,dele...

BSTR詳解三 BSTR使用注意事項

1 how to use bstr 1.1 bstr分析 bstr設計對於c 程式設計師好壞參半。一方面,bstr可以被用於大多數需要olechar陣列作為引數的函式。另一方面,不能用熟悉的c c 函式進行對bstr的分配 釋放和處理,例如malloc,free,new,delete,lstrcat...

BSTR詳解三 BSTR使用注意事項

2007 9 7 21 34 12 1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 ma...