BSTR詳解三 BSTR使用注意事項

2021-04-29 00:29:39 字數 3217 閱讀 5124

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,它們是...