6

VC++ の c++ インターフェイスを備えたサードパーティの 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 のものなので、変更できるとは思いません。実際にはどのようなオプションがありますか? メッセージボックスをユーザーに表示して、優雅に戻りたいだけです。

4

1 に答える 1

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割り当てなどもスローできること#importです。COM DLL からコードを使用する場合、MSVC の comutil ライブラリから生成されたスマート ポインターを使用する場合は、この形式に慣れてください。

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

于 2013-02-11T16:25:24.267 に答える