几乎所有 COM 函数和接口方法都返回类型 HRESULT的值。 HRESULT(名称可以作为“结果句柄”读取)是返回成功、警告或错误值的方法。 HRESULT 实际上不是句柄(请参阅 为什么 HRESULT 在不是任何作的句柄时以 H 开头?;它只是一个值,其中多个字段已编码到其中。 根据 COM 规范,零的结果表示成功,非零结果表示失败。
Important
始终检查 HRESULT 返回值。 从不忽略 COM 函数的返回值。
FAILED()使用和SUCCEEDED()宏(定义在<winerror.h>) - 不直接进行比较S_OK,因为存在以外的S_OK成功代码(例如, S_FALSE):
// ✅ Correct — handles all failure codes
HRESULT hr = pStream->Read(buffer, cbSize, &cbRead);
if (FAILED(hr)) {
// Handle error
return hr;
}
// ❌ Wrong — misses failure codes that aren't E_FAIL
if (hr == E_FAIL) { ... }
// ❌ Wrong — S_FALSE is success but != S_OK
if (hr != S_OK) { /* this fires for S_FALSE too */ }
用于错误处理的新式帮助程序:
-
THROW_IF_FAILED(hr)— Windows实现库(wil)在失败时引发 C++ 异常 -
winrt::check_hresult(hr)— C++/WinRT 等效项,引发winrt::hresult_error -
LOG_IF_FAILED(hr)— 用于记录失败但继续执行的宏
在源代码级别,所有错误值都包含三个部分,用下划线分隔。 第一部分是标识与错误关联的设施的前缀,第二部分是 E 表示错误,第三部分是描述实际条件的字符串。 例如,当硬盘上没有剩余空间时,将返回 STG_E_MEDIUMFULL。 STG 前缀指示存储设施、E 指示状态代码表示错误,MEDIUMFULL 提供有关错误的特定信息。 你可能希望从接口方法或函数返回的许多值都在 Winerror.h 中定义。
有关错误处理的详细信息,请参阅以下部分:
相关主题