要遵循典型的COM程序,每當出現任何錯誤,必須做到以下幾點:如何在C++中調用COM時包裝錯誤?
- 檢查
HRESULT
與FAILED
或類似的,看看是否有錯誤發生。 - 創建一個變量來保存一個
IErrorInfo
(通常CComPtr<IErrorInfo>
) - 呼叫
::GetErrorInfo(0, &var)
。 - Get the human readable version of that by calling
IErrorInfo::GetDescription
. - 將
BSTR
轉換爲std::wstring
。 - 將
std::wstring
轉換爲某種形式的char const*
。 - 拋出一個用戶定義的異常類型,它來自
std::exception
,它揭示了上面的第1,5和6位。
這一切看起來都像是很多樣板,它必須圍繞COM中的每個函數調用。我知道MSVC++編譯器提供了一大堆東西來使COM更容易搞亂,比如ATL和編譯器特定的COM擴展_com_error
,_com_raise_error
和類似的,但我不確定如何使用這些,或者如果他們甚至打算被用戶代碼使用。
是否有任何典型的策略用於以異常安全和競爭條件安全的方式管理這種複雜性?
從#import指令開始,其餘部分自動放置到位。 – 2012-04-16 01:04:56
@HansPassant:我沒有針對相關目標的類型庫。 (所有我是'wbemidl.h') – 2012-04-16 01:10:37
然後fuggedaboudid,你必須自己包裹。只需編寫一個CheckHR()函數。 – 2012-04-16 01:22:56