1 how to use bstr
1.1 bstr分析
bstr設計對於c++程式設計師好壞參半。一方面,bstr可以被用於大多數需要olechar陣列作為引數的函式。另一方面,不能用熟悉的c/c++函式進行對bstr的分配、釋放和處理,例如malloc, free, new, delete, lstrcat, and lstrlen 等函式不能用於處理bstr。就像對介面指標和類指標的處理不一樣,對bstr的處理和對tchar*的處理也不一樣。bstr是一種c語言方式的型別定義方式,這種定義方式提高了bstr在c++的應用效率,但是也帶來了很多的潛在風險,它使程式設計師失去了利用編譯器檢查潛在問題的機會。
1.2 bstr使用基本規則
在對bstr進行讀取操作的時候,可以把bstr看作olechar陣列。bstr可以用於const wchar_t*(lpctstr/ lpcwstr/ cosnt tchar*/ cosnt wchar* in unicode project),不能用於需要wchar_t* (lptstr/ lpwstr/ tchar*/ wchar* in unicode project)的地方。
如果有相應的bstr處理函式,必須使用bstr處理函式,不要使用普通字串函式。特別是乙個bstr包含多個字串(也就是,包含多個0結束符)的情況。在對bstr進行修改(包括建立和釋放時),必須使用bstr的專用函式。主要要保證對字元長度字首的正確修改。不要直接讀取bstr的長度域,應該使用bstr處理函式計算長度。
string manipulation functions descriptions
sysallocstring creates and initializes a string.
sysallocstringbytelen creates a zero-terminated string of a specified length.
sysallocstringlen creates a string of a specified length.
sysfreestring frees a previously created string.
sysreallocstring changes the size and value of a string.
sysreallocstringlen changes the size of an existing string.
sysstringbytelen returns the length of a string in bytes.
sysstringlen returns the length of a string.
null是bstr的有效值。按照約定,它可以被看作含有0個字元的字串。bstr變數必須等於null,或者正確分配的bstr指標。在改變bstr變數的之前,必須釋放原來指向的bstr。不要把bstr直接初始化成常量字元指標,例如,bstr bs = l」」。
automation會cache bstr使用的空間,以提高sysallocstring/sysfreestring 的效能,會給測試發現問題帶來困難。如果可能推薦在除錯時使用compuware devpartner 7.x及更高版本的工具。
1.3 bstr引數使用
多數時候,bstr是被用於函式引數。關於bstr引數的使用規則是bstr型別的基礎。只有熟練掌握,才能分析warpper類或轉換函式的正確性。
基本原則:在給by-reference[in/out]引數賦乙個新的值前,被呼叫者負責釋放。其他情況,都是呼叫者負責釋放。
呼叫者使用bstr的規則如下:
· 釋放被呼叫函式返回的bstr,或者被呼叫函式通過by-reference返回的bstr。
hresult iwebbrowser2::get_statustext( bstr far* pbstr );
//...
bstr bstrstatus;
pbrowser->get_statustext( &bstrstatus );
// shows using the win32 function
// to freee the memory for the string:
::sysfreestring( bstrstatus );
· 釋放通過by-value方式傳給其他函式的bstr.
//.h
hresult iwebbrowser2::put_statustext( bstr bstr );
//.cpp
// shows using the win32 function
// to allocate memory for the string:
bstr bstrstatus = ::sysallocstring( l"some text" );
if (bstrstatus == null)
return e_outofmemory;
pbrowser->put_statustext( bstrstatus );
// free the string:
::sysfreestring( bstrstatus );
//...
被呼叫者按照如下規則處理bstr:
· 如果乙個bstr引數是by-reference方式,在給引數賦新值之前,free以前的值。如果沒有給引數賦的新值,不要free傳入值。
void refreshbstr(bstr& bs)
// bs is an [in/out] parameter. bstr* is the same
· 不要free通過by-value傳入的bstr。
void setbstr(bstr bs)
// bs is an [in] parameter. bstr* is the same
· 不要free返回給呼叫者的 bstr .
bstr getbstr1()
void getbstr2(bstr* pbs)
· 如果需要儲存傳入的bstr,被呼叫著需要用sysallocstring()生成乙個新的副本,並儲存。輸入的bstr會被呼叫者釋放。
void myclass::setbstr(bstr bs)
· 如果需要返回乙個已經儲存的bstr,返回bstr的乙個拷貝。呼叫者釋放返回的bstr拷貝。
void myclass::getbstr(bstr* pbs)
BSTR詳解三 BSTR使用注意事項
1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 malloc,free,new,dele...
BSTR詳解三 BSTR使用注意事項
2007 9 7 21 34 12 1 how to use bstr 1.1 bstr 分析 bstr 設計對於 c 程式設計師好壞參半。一方面,bstr 可以被用於大多數需要 olechar 陣列作為引數的函式。另一方面,不能用熟悉的 c c 函式進行對 bstr 的分配 釋放和處理,例如 ma...
如何使用BSTR
bstr是一種字串指標,如果你在vc找尋其定義,你會發現它其實是unsigned short 然而它不能像普通的字串指標char 一樣可以直接賦值,而必須使用sysallocstring來分配,用sysfreestring來釋放。另外,又有兩個bstr的包容類 bstr t和ccombstr,它們是...