我需要一個CString
實例轉換爲正確分配BSTR
並傳遞BSTR
到COM方法。要使編碼和ANSI和Unicode統一工作的代碼我使用CString::AllocSysString()
將任何格式CString
轉換爲Unicode BSTR。如何最好地將CString轉換爲BSTR以將它作爲「in」參數傳遞給COM方法?
因爲沒有人擁有返回BSTR我需要照顧它,並釋放該呼叫在最異常安全的方式更多鈔票,用盡可能少的代碼可能完成之後。
目前我使用ATL::CComBSTR
的生命週期管理:
ATL::CComBSTR converted;
converted.Attach(sourceString.AllocSysString()); //simply attaches to BSTR, doesn't reallocate it
interface->CallMethod(converted);
什麼,我不喜歡這裏,我需要兩個單獨的語句,只是構建綁定到皈依結果ATL::CComBSTR
。
有沒有更好的方法來完成同樣的任務?
這肯定會工作,除了使用CComBSTR構造函數,我將不得不檢查BSTR分配是否成功(CString :: AllocSysString()執行檢查並引發異常),並且使用_bstr_t我必須處理_com_issue_error()函數 - 覆蓋它或捕獲拋出的_com_error。 – sharptooth 2010-01-19 14:08:00
爲什麼不讓被調用的方法負責檢查自己的參數的有效性呢?如果分配失敗,「CComBSTR :: m_str」將爲空。所以無論是被調用的方法都會檢查null並返回'E_INVALIDARG',或者它不會和你已經擁有的'CString :: AllocSysString()'相同的'catch'可以爲你處理異常。這是一個更清潔的成語,而不是明確地執行自己的檢查,恕我直言。 – 2010-01-19 14:56:17
@Phil Booth:被調用的方法可能將空BSTR解釋爲特例。例如,含義可以是「指定文件名,如果傳遞空字符串,則使用默認文件名」。所以被調用的方法可能沒有機會知道存在問題。 – sharptooth 2010-01-25 11:24:47