2013-02-11 21 views
6

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のものだからこのコードを変更できるとは思わない。実際にどのようなオプションがありますか?私はちょうどユーザーにメッセージボックスを持って来て、優雅に戻ってほしい。

+1

あなたは 'FAILED(_hr) 'ステータスのためにスローされている' _com_error& 'をキャッチしていないので、「クラッシュしていませんか?あなたがこれをデバッグした場合、生成されたエラーはSEVERITYビットが点灯していることを保証するでしょう。 – WhozCraig

+0

私はCOMに慣れていないので、キャッチする必要はありますか?それはcatch()ブロックでですか? – zar

+0

はい。一般的なルールは、例外がスローされる可能性がある場合、それを捕まえて処理する必要があるか、呼び出し元がそうする***を知っている***です。それはどちらもされていないように聞こえる。 MSVCの 'comutil'サポート層はかなり強力です。ほぼ独自の方法論です。私はあなたがこれをどのように扱うことができるかのサンプルを以下に示します。 – WhozCraig

答えて

5

すでにあなたのコードでこれをやっていない場合、あなたは、発信者側からする必要があります。

try 
{ // setup your invoke for your object... 
    IGLibMgrPtr spMgr = .... 
    bstr_t bstrPath = .... 

    // invoke your call. 
    _RecordsetPtr spRS = spMgr->GetLibInfo(bstrPath); 

    ... continue normal processing ... 
} 
catch(const _com_error& ce) 
{ 
    // handle your error here. 
} 

これは、複数のレベルで重要です。あなたのIGLibMgrメンバーが例外をスローできるだけでなく、bstr_t割り当てなども可能です。COM DLLから#importコードを使用する場合は、MSVCのcomutilライブラリから生成されたスマートポインタを使用する場合はこの形式に慣れてください。

注:_com_errorクラスは、エラーが発生した理由(HRESULT、エラーの説明文字列など)を取得するためのメンバーをいくつか提供します。エラー復帰オブジェクトによって作成されたIErrorInfoへのアクセスも提供します。その詳細レベルを提供します。

+0

const: 'catch(const _com_error&ex){...}' – nogard

+0

@nogard egads少なくとも1つのプロジェクトで少なくとも100万行のコードを実行しました。それ。 = P – WhozCraig

関連する問題