1.?使用_bstr_t解決內存問題
????COM編程當中一個重要的主題就是維護?BSTR?類型變量.?在一些情況下(主要是傳遞或者復制?BSTR?類型數據的時候)會產生一些問題:
????*?函數不能接收?BSTR?類型的變量參數
????*?復制?BSTR?類型數據的時候導致內存泄漏
????通常使用?_bstr_t?對象可以解決這些問題,?這個對象封裝了?BSTR?數據類型,?自動進行資源的分配合管理,?并且提供一個自動的數據類型轉換操作.
????注意:?使用強制類型轉換?_bstr_t?的方式對于?Unicode?模式鏈接是不適用的,?需要使用?Win32?模式鏈接.?
????此外,?這里也有一個內存管理的問題,?使用賦值模式就會產生內存泄漏:
????BSTR?tmpBStr;
????m_pObject1->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?<comutil.h>
????int?main()
????{
???????char?sz[]="hello";
???????_bstr_t?b;
???????b?=?_com_util::ConvertStringToBSTR(sz);
???????char?*?p?=?_com_util::ConvertBSTRToString(b);
???????return?1;
????}?