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