3

次のマクロに相当するものを探しています。

#define FAILED_CHECK(hr) if(FAILED(hr)) return hr;

上記のように動作するATLライブラリ内の実装はありますか?

ありがとう!

4

3 に答える 3

3

何らかの理由で、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_THROWATLENSURE_SUCCEEDEDおよび友人。

特に、espHRESULTを使用して失敗時に例外をスローし、例外をキャッチできます。ATLENSURE_SUCCEEDEDCOM インターフェイス呼び出しから戻る前に、HRESULT に変換します。

_ATLTRY {
  // ...
  ATLENSURE_SUCCEEDED(pFoo->Bar()); // Bar returns HRESULT 
  // ...
} _ATLCATCH(Exception) { // CAtlException class
  return Exception; // Back to HRESULT through CAtlException's operator
}
于 2012-05-30T09:16:44.997 に答える
1

ほとんどの ATL 関数は標準のHRESULTを使用するため、ATL 固有のマクロはありません。最も一般的な HRESULT 値のリストを参照してください。

FAILEDSUCCEEDEDなど、最もよく使用されるエラー処理用のマクロがあります。

#define FAILED(hr) (((HRESULT)(hr)) < 0)
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)

したがって、通常はこれらを使用するか、特定の状況で特定の HRESULT が返されることが予想されるため、目的の値と明示的に等しいかどうかを確認することになります。この場合、おそらく次のように終了します。

HRESULT hr = ...
if (hr != S_OK)
    ...
于 2012-05-30T09:02:34.563 に答える
0

これはアルファベット順にソートされたATLマクロのリストです。代わりに、このリストはデバッグとエラー報告に焦点を当てています。あなたが要求したようなものはないようです。

于 2012-05-30T08:57:00.390 に答える