2

このSOの回答に基づいて:例外の特定の部分のみを確認する必要がある場合は、OSおよび複数のバージョンのOL間でCOMExceptionを適切に処理するために、COMException固有のエラーコードをキャッチします。例えば、

private const uint HRESULT_OPERATIONABORTED = 0x80004004;

// ...

    try {
        // something that could throw COMExceptions
    } catch (System.Runtime.InteropServices.COMException e) {

        switch ((uint)e.ErrorCode) {

            case HRESULT_OPERATIONABORTED:
                break;

            default:
                break;
        }
    }

これは十分にクロスプラットフォームですか、それともエラーコードの一部のみを考慮する必要がありますか?

編集-明確にするために、私の正確な質問は、比較が具体的すぎるかどうか(uint)e.ErrorCode0x80004004つまり、OS / OLに関係なく、常にこの特定のエラーが発生するかどうか0x80004004)、またはこれが適切な方法であるかどうかです。 。

4

2 に答える 2

0

また、COMオブジェクトから返されたHRESULTの結果であるSystem.OutOfMemoryExceptionやその他の例外などをキャッチすることも検討してください。すべての失敗したHRESULTがCOMExceptionになるわけではありません。

私が見たほとんどのMAPIエラーでは、エラーコードは標準のC MAPIヘッダーファイルで宣言されているものと変わらないので、switchステートメントで問題ないと思います。言い換えれば、そのメソッドは、Cで記述されたMAPIクライアントアプリケーションよりも互換性が低いものであってはなりません。

于 2011-05-23T22:51:44.963 に答える
0

クロスプラットフォームの互換性に関する限り、心配する必要はほとんどありません。COMはWindowsでのみ実行されます。同様に、エラーコードは明確に定義されたものです。WinError.hSDKヘッダーファイルで標準のCOMエラーコードを検索できます。E_ABORTです。実際にその識別子を使用することをお勧めします。

このヘッダーは、c:\ program files \ microsoft sdks \ windows \ v6.0\includeにあります。VS2010ではv7.0です。

于 2011-05-23T23:19:20.810 に答える