次のマクロに相当するものを探しています。
#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;
上記のように動作するATLライブラリ内の実装はありますか?
ありがとう!
次のマクロに相当するものを探しています。
#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;
上記のように動作するATLライブラリ内の実装はありますか?
ありがとう!
何らかの理由で、ATL は要求されたような非常に便利なマクロを提供していません。Visual Studio のいくつかのリリースから始めて、ATL は同様のマクロを導入しました。
/* Naming is slightly off in these macros
ATLENSURE_RETURN(condition) is an HRESULT return of E_FAIL
ATLENSURE_RETURN_VAL(condition, hr) is any return value (function can pick)
ATLENSURE_RETURN_HR(condition, hr) is HRESULT-specific, though currently the same as _VAL
*/
しかし、繰り返しになりますが、すぐに一致するものはありませんでした。自分で定義する必要があります。または、エラー条件で例外をスローするように切り替えます。ATL は、このための便利なマクロを提供します: ATLENSURE_THROW
、ATLENSURE_SUCCEEDED
および友人。
特に、espHRESULT
を使用して失敗時に例外をスローし、例外をキャッチできます。ATLENSURE_SUCCEEDED
COM インターフェイス呼び出しから戻る前に、HRESULT に変換します。
_ATLTRY {
// ...
ATLENSURE_SUCCEEDED(pFoo->Bar()); // Bar returns HRESULT
// ...
} _ATLCATCH(Exception) { // CAtlException class
return Exception; // Back to HRESULT through CAtlException's operator
}
ほとんどの ATL 関数は標準のHRESULTを使用するため、ATL 固有のマクロはありません。最も一般的な HRESULT 値のリストを参照してください。
FAILEDやSUCCEEDEDなど、最もよく使用されるエラー処理用のマクロがあります。
#define FAILED(hr) (((HRESULT)(hr)) < 0)
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
したがって、通常はこれらを使用するか、特定の状況で特定の HRESULT が返されることが予想されるため、目的の値と明示的に等しいかどうかを確認することになります。この場合、おそらく次のように終了します。
HRESULT hr = ...
if (hr != S_OK)
...
これはアルファベット順にソートされたATLマクロのリストです。代わりに、このリストはデバッグとエラー報告に焦点を当てています。あなたが要求したようなものはないようです。