一起討論一個BSTR型別轉換問題 (轉)
[總結和翻譯自MSDN]
[BSTR和字串操作]
1. 使用_bstr_t解決問題
COM當中一個重要的主題就是維護 BSTR 型別變數. 在一些情況下(主要是傳遞或者複製 BSTR 型別資料的時候)會產生一些問題:
* 不能接收 BSTR 型別的變數引數
* 複製 BSTR 型別資料的時候導致記憶體洩漏
通常使用 _bstr_t 可以解決這些問題, 這個物件封裝了 BSTR 資料型別, 自動進行資源的分配合管理, 並且提供一個自動的資料型別轉換操作.
注意: 使用強制型別轉換 _bstr_t 的方式對於 Unicode 連結是不適用的, 需要使用 模式連結.
此外, 這裡也有一個記憶體管理的問題, 使用賦值模式就會產生記憶體洩漏:
BSTR tmpBStr;
m_p1->get_ObjectString(&tmpBStr);
_bstr_t tmpbstr;
tmpbstr= tmpBStr; //記憶體洩漏
SetDlgItemText(IDC_CURPROPVAL, tmpbstr);
在 tmpbstr 變數初始化的時候發生洩漏, 函式 SysAllocString 在建立 tmpbstr 變數的時候被自動. 這個新申請的資源以後不會釋放, 導致記憶體洩漏.
2. BSTR 資料型別
1) BSTR , LPWSTR 和 LPSTR
LPSTR 就是我們日常使用的一個MFC的char*指標的宏定義, LPWSTR 比 LPSTR 多一倍的資源使用, 因為它和漢字一樣使用雙位元組表達一個字元, BSTR 則額外多一個資訊頭部存放資料長度.
2) 如何將LPSTR/LPCTSTR轉換成為BSTR/LPWSTR
其實MFC/ATL提供了一組宏定義用於轉換這些資料型別, 因為需要先使用USES_CONVERSION;宏, 裡面呼叫了_alloc申請並且自動釋放需要的資源, 為此你不必擔心前面提到的記憶體維護問題:
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T
或者你可以使用MSDN裡面的一個無法透過提到的兩個函式實現字串到BSTR的轉換
//使用 /Gr 或者 /Gz 編譯開關, 或者包含一個 comsupp.lib 就行了
#include
int main()
{
char sz[]="hello";
_bstr_t b;
b = _com_util::ConvertStringToBSTR(sz);
char * p = _com_util::ConvertBSTRToString(b);
return 1;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991889/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cgo 型別轉換問題??Go型別
- 日期型別轉換問題型別
- Double型別轉換成BigDicimal問題型別
- java型別轉換與強制型別轉換(轉)Java型別
- tp5.0 的模型型別轉換問題模型型別
- PHP 型別轉換&&型別強制轉換PHP型別
- 一個簡單函式—Number型別轉換Date型別函式型別
- 型別轉換型別
- Struts2日期型別轉換問題???型別
- 把一個任意型別的值轉換為布林型別型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- jivejdon中javax.mail.Session的型別轉換問題。JavaAISession型別
- 關於Ibatis 轉換 oracle date型別的問題BATOracle型別
- 資料型別,型別轉換資料型別
- js型別轉換JS型別
- 字元型別轉換字元型別
- 3.2 型別轉換型別
- JavaScript 型別轉換JavaScript型別
- Golang型別轉換Golang型別
- 型別轉換(cast)型別AST
- C++中的向上型別轉換和向下型別轉換C++型別
- 對論壇中有關資料型別轉換的總結 (轉)資料型別
- (一) 溫度轉換問題
- Mybatis實踐(一)型別轉換器MyBatis型別
- JS 型別轉換,小嚐一口JS型別
- 附一張js的型別轉換JS型別
- [基礎] JavaScript 型別轉換及面試題JavaScript型別面試題
- interface{} 型別的轉換型別
- JNI常用型別轉換型別
- 資料型別轉換資料型別
- go interface{}型別轉換Go型別
- 型別轉換注意點型別
- 強制型別轉換型別
- 變數型別轉換變數型別
- spark dataframe 型別轉換Spark型別
- 容器,型別轉換。List。型別
- sql server型別轉換SQLServer型別
- 陣列型別轉換陣列型別