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...