如何使用BSTR

2021-06-27 10:44:53 字數 2615 閱讀 1115

bstr是一種字串指標,如果你在vc找尋其定義,你會發現它其實是unsigned

short*

,然而它不能像普通的字串指標char*一樣可以直接賦值,而必須使用sysallocstring來分配,用sysfreestring來釋放。

另外,又有兩個bstr的包容類_bstr_t和ccombstr,它們是為了程式設計者使用bstr更加方便,因為在他們的建構函式中都呼叫了sysallocstring,析構函式呼叫了sysfreestring,然而使用這兩個類時仍然需要特別注意,否則也會導致不可預知的錯誤。

舉例如下:

1.標準用法:

bstr str = sysallocstring(l」aaa」);

…(可以使用此bstr變數的範圍)

sysfreestring(str);

str = null;

需要注意的是當sysfreestring被呼叫後,最好將此bstr變數賦為null,以防止多次釋放,導致釋放非法記憶體空間。

2._bstr_t型別有乙個函式叫copy,使用時需要當心,因為它其實呼叫了sysallocstringbytelen,所以需要呼叫者去釋放返回的bstr字串。

用法如下:

_bstr_t m_state = l"cc";

bstr str = m_state.copy();

…(可以使用此bstr變數的範圍)

sysfreestring(str);

str = null;

3._bstr_t型別有乙個特殊建構函式,其第二個引數是乙個bool值,表示是否進行sysallocstring,如果是false

,表示直接將此字元指標賦給_bstr_t內部所包容的bstr,這雖然給使用者帶來了更大的靈活性,但卻需要使用時更加注意,用法如下:

bstr str1 = sysallocstring(l」aaa」);

_bstr_t str2(str1, false);

注意,此時不需要呼叫sysfreestring,因為_bstr_t的建構函式雖然沒有呼叫sysallocstring,但其析構函式仍然會呼叫sysfreestring。所以不需要使用者自己去釋放了。

4.函式介面傳遞bstr或bstr*的基本規則

·        如果呼叫乙個使用bstr引數的函式,呼叫者負責在呼叫前分配bstr,在呼叫後釋放。例如:

hresult iwebbrowser2::put_statustext( bstr bstr );

// 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。例如:

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 );

·        如果你實現乙個返回bstr的函式,在函式內部分配記憶體但不要釋放。呼叫者負責釋放。例如:

// example shows using mfc's

// cstring::allocsysstring

hresult cmyclass::get_statustext( bstr * pbstr )

try//m_str is a cstring in your class

*pbstr = m_str.allocsysstring( );

catch (...)

return e_outofmemory;

// the client is now responsible for freeing pbstr.

return( s_ok );

·        時刻牢記bstr是乙個指標,而不是乙個物件。儘量減少使用bstr作為結構體或類的成員變數。如果必須使用,一定要認真考慮如何分配和釋放。

5.下面介紹一種比較複雜的情況,利於對問題的深入理解。例如我們現在用到的icf底層庫就有很多類似下面的函式:

void ctestdlg::getstring(bstr* state)

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