请问WIN32编程中的HRESULT类型和LRESULT类型有什么不同呢

本文介绍了LRESULT和HRESULT这两种常见的Windows环境下返回值类型。LRESULT主要用于窗口程序或回调函数的返回,而HRESULT常用于COM接口函数调用。两种类型均为32位无符号长整型值,但所携带的意义不同。

LRESULT :WIN32环境下Windows进程或者回调函数的返回值
HRESULT :COM函数和方法的返回值
LRESULT  LRESULT是一个数据类型
HRESULT      函数返回值。

其实都是32位的无符号长整型值,只不过其分别代表的含义不同
 

LRESULT

  LRESULT是一个数据类型,
  MSDN: 32-bit value returned from a window procedure or callback function
  指的是从窗口程序或者回调函数返回的32位值

HRESULT 

 
      函数返回值。如果这个函数是执行完返回的话将包含就有实际意义的数据,如果立即返回则包含状态信息--发送成功与否,并不能说明执行的如何。
  HRESULT
  A value returned from a function call to an interface, consisting of a severity code, context information, a facility code, and a status code that describes the result. For 16-bit Windows systems, the HRESULT is an opaque result handle defined to be zero for a successful return from a function, and nonzero if error or status information is to be returned. To convert an HRESULT into a more detailed SCODE (or return value), applications call GetSCode(). See SCODE.
  HRESULT 是一种简单的数据类型,通常被属性和 ATL 用作返回值。下表说明各种不同的值。头文件 winerror.h 中包含更多的值。
  名称 说明 值
  S_OK 操作成功 0x00000000
  E_UNEXPECTED 意外的失败 0x8000FFFF
  E_NOTIMPL 未实现 0x80004001
  E_OUTOFMEMORY 未能分配所需的内存 0x8007000E
  E_INVALIDARG 一个或多个参数无效 0x80070057
  E_NOINTERFACE 不支持此接口 0x80004002
  E_POINTER 无效指针 0x80004003
  E_HANDLE 无效句柄 0x80070006
  E_ABORT 操作已中止 0x80004004
  E_FAIL 未指定的失败 0x80004005
  E_ACCESSDENIED 一般的访问被拒绝错误 0x80070005
  不能简单地把返回值与 S_OK 和 S_FALSE 比较,而要用 SUCCEEDED 和 FAILED 宏进行判断。
HRESULT 是一种在 Windows 平台编程中广泛使用的数据类型,尤其在 COM(Component Object Model)编程中扮演重要角色。它是一个 32 位有符号整数(signed 32-bit integer),用于表示函数调用的结果状态,既可以表示成功,也可以表示错误或警告。 ### HRESULT 的定义 HRESULT 的结构由多个位域组成,用于描述错误的来源、严重性以及错误代码。其结构定义如下: ```cpp typedef LONG HRESULT; ``` 每个 HRESULT 值可以分为以下几个部分: - **Severity**(严重性):1 位,0 表示成功,1 表示失败。 - **Facility**(设施代码):11 位,表示错误来源的系统或组件。 - **Code**(错误代码):20 位,表示具体的错误编号。 例如,`S_OK` 表示操作成功,其值为 `0x00000000`;而 `E_FAIL` 表示一个通用的失败,其值为 `0x80004005`。 ### HRESULT 的使用场景 1. **COM 接口调用**: COM 组件的接口方法通常返回 HRESULT,以告知调用者操作是否成功。例如: ```cpp HRESULT hr = pUnknown->QueryInterface(IID_IUnknown, (void**)&pNewUnknown); if (SUCCEEDED(hr)) { // 成功处理逻辑 } else { // 错误处理逻辑 } ``` 在 COM 操作中,务必检查 HRESULT 的返回值以确保程序的健壮性[^1]。 2. **错误处理与调试**: 通过 HRESULT,开发者可以获取详细的错误信息,例如使用 `FormatMessage` 或 `IShellDispatch::ShowFolder` 等 API 来获取可读性强的错误描述。 3. **HRESULT 辅助宏**: Windows SDK 提供了多个宏来简化 HRESULT 的判断操作: - `SUCCEEDED(hr)`:判断操作是否成功。 - `FAILED(hr)`:判断操作是否失败。 - `HRESULT_FROM_WIN32(err)`:将 Win32 错误码转换为 HRESULT。 4. **与其他异常处理机制的交互**: 在 C++ 中,HRESULT 可以与 `_com_error` 异常结合使用,特别是在使用 Visual C++ 的 `/EHsc` 编译选项时。例如,某些 COM 方法可能会抛出 `_com_error` 类型的异常,开发者可以通过捕获该异常并调用 `Error()` 方法获取 HRESULT 值[^2]。 5. **OLE 自动化 MFC 框架**: 在 OLE 自动化编程 MFC(Microsoft Foundation Classes)框架中,HRESULT 也常用于报告错误。MFC 提供了 `COleDispatchException` 类来封装 OLE 自动化中的异常信息,其中包含了 HRESULT 错误描述字符串。 6. **Windows API DirectX 编程**: 在使用 Windows API 或 DirectX 时,很多函数返回 HRESULT,用于指示操作是否成功。例如,在 Direct3D 中创建设备或加载纹理时,必须检查 HRESULT 以确保资源正确加载。 ### 总结 HRESULTWindows 平台上用于错误报告的核心机制之一,尤其在 COM 编程中至关重要。开发者应始终检查 HRESULT 返回值,并根据需要进行适当的错误处理,以确保应用程序的稳定性健壮性[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值