BSTR詳解三 BSTR使用注意事項

2021-04-12 16:52:18 字數 3390 閱讀 1348

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

使用基本規則

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.

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

如何使用BSTR

bstr是一種字串指標,如果你在vc找尋其定義,你會發現它其實是unsigned short 然而它不能像普通的字串指標char 一樣可以直接賦值,而必須使用sysallocstring來分配,用sysfreestring來釋放。另外,又有兩個bstr的包容類 bstr t和ccombstr,它們是...