VC++には、そのC++インターフェイスを持つサードパーティのCOMコンポーネントがあります。下のコールでアプリケーションがクラッシュするクラッシュが発生しています。私のアプリケーションの一部ではないこの機能から、正常に回復するにはどうすればよいですか?COMエラーから正常に回復するには?
inline _RecordsetPtr IGLibMgr::GetLibInfo (_bstr_t LibPath) {
struct _Recordset * _result = 0;
HRESULT _hr = raw_GetLibInfo(LibPath, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _RecordsetPtr(_result, false);
}
最終行でクラッシュします。私はサードパーティのCOMのものだからこのコードを変更できるとは思わない。実際にどのようなオプションがありますか?私はちょうどユーザーにメッセージボックスを持って来て、優雅に戻ってほしい。
あなたは 'FAILED(_hr) 'ステータスのためにスローされている' _com_error& 'をキャッチしていないので、「クラッシュしていませんか?あなたがこれをデバッグした場合、生成されたエラーはSEVERITYビットが点灯していることを保証するでしょう。 – WhozCraig
私はCOMに慣れていないので、キャッチする必要はありますか?それはcatch()ブロックでですか? – zar
はい。一般的なルールは、例外がスローされる可能性がある場合、それを捕まえて処理する必要があるか、呼び出し元がそうする***を知っている***です。それはどちらもされていないように聞こえる。 MSVCの 'comutil'サポート層はかなり強力です。ほぼ独自の方法論です。私はあなたがこれをどのように扱うことができるかのサンプルを以下に示します。 – WhozCraig