1.?使用_bstr_t解決內(nèi)存問題
????COM編程當(dāng)中一個(gè)重要的主題就是維護(hù)?BSTR?類型變量.?在一些情況下(主要是傳遞或者復(fù)制?BSTR?類型數(shù)據(jù)的時(shí)候)會(huì)產(chǎn)生一些問題:
????*?函數(shù)不能接收?BSTR?類型的變量參數(shù)
????*?復(fù)制?BSTR?類型數(shù)據(jù)的時(shí)候?qū)е聝?nèi)存泄漏
????通常使用?_bstr_t?對(duì)象可以解決這些問題,?這個(gè)對(duì)象封裝了?BSTR?數(shù)據(jù)類型,?自動(dòng)進(jìn)行資源的分配合管理,?并且提供一個(gè)自動(dòng)的數(shù)據(jù)類型轉(zhuǎn)換操作.
????注意:?使用強(qiáng)制類型轉(zhuǎn)換?_bstr_t?的方式對(duì)于?Unicode?模式鏈接是不適用的,?需要使用?Win32?模式鏈接.?
????此外,?這里也有一個(gè)內(nèi)存管理的問題,?使用賦值模式就會(huì)產(chǎn)生內(nèi)存泄漏:
????BSTR?tmpBStr;
????m_pObject1->get_ObjectString(&tmpBStr);
????_bstr_t?tmpbstr;
????tmpbstr=?tmpBStr;?//內(nèi)存泄漏
?????SetDlgItemText(IDC_CURPROPVAL,?tmpbstr);
????在?tmpbstr?變量初始化的時(shí)候發(fā)生泄漏,?函數(shù)?SysAllocString?在創(chuàng)建?tmpbstr?變量的時(shí)候被自動(dòng)調(diào)用.?這個(gè)新申請(qǐng)的資源以后不會(huì)釋放,?導(dǎo)致內(nèi)存泄漏.?
?2.?BSTR?數(shù)據(jù)類型
?1)?BSTR?,?LPWSTR?和?LPSTR
????LPSTR?就是我們?nèi)粘J褂玫囊粋€(gè)MFC的char*指針的宏定義,?LPWSTR?比?LPSTR?多一倍的資源使用,?因?yàn)樗蜐h字一樣使用雙字節(jié)表達(dá)一個(gè)字符,?BSTR?則額外多一個(gè)信息頭部存放數(shù)據(jù)長(zhǎng)度.
?2)?如何將LPSTR/LPCTSTR轉(zhuǎn)換成為BSTR/LPWSTR
????其實(shí)MFC/ATL提供了一組宏定義用于轉(zhuǎn)換這些數(shù)據(jù)類型,?因?yàn)樾枰仁褂肬SES_CONVERSION;宏,?里面調(diào)用了_alloc申請(qǐng)并且自動(dòng)釋放需要的資源,?為此你不必?fù)?dān)心前面提到的內(nèi)存維護(hù)問題:
????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里面的一個(gè)無法通過索引提到的兩個(gè)函數(shù)實(shí)現(xiàn)字符串到BSTR的轉(zhuǎn)換
????//使用?/Gr?或者?/Gz?編譯開關(guān),?或者包含一個(gè)?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;
????}?