【发布时间】:2008-12-18 09:23:15
【问题描述】:
我见过很多将函数调用包装在 FAILED() 函数/方法/宏中的示例 C++ 代码。 有人可以向我解释这是如何工作的吗?如果可能的话,有人知道 c# 等价物吗?
【问题讨论】:
我见过很多将函数调用包装在 FAILED() 函数/方法/宏中的示例 C++ 代码。 有人可以向我解释这是如何工作的吗?如果可能的话,有人知道 c# 等价物吗?
【问题讨论】:
它通常检查 COM 函数错误。但是检查任何返回 HRESULT 的函数就是它的意义所在。如果HRESULT 值为负,则FAILED 返回一个真值,这意味着函数失败(“错误”或“警告”严重性)。 S_OK 和 S_FALSE 都 >= 0,因此它们不用于传达错误。 “负数”是指为HRESULT 错误代码设置高位,即,它们的十六进制表示,可以在 例如,winerror.h 中找到, 以 8 开头,如 0x8000FFFF。
【讨论】:
This page 显示定义 FAILED() 的 WinError.h 包含文件的一半。它实际上只是一个非常简单的宏,整个定义是这样的:
#define FAILED(Status) ((HRESULT)(Status)<0)
【讨论】:
如果可能的话,有人知道 c# 等价物吗?
在 C# 中实际上不需要它,除非您使用的是 COM 对象。大多数 .NET 函数要么已经返回(或多或少)有意义的值(即 null、false),要么在失败时抛出异常。
如果您直接访问 COM 对象,您可以定义一个简单的 Failed 函数,该函数执行 unwind 帖子中的宏所做的事情。在本地定义(受保护/私有),因为杂乱无章的 COM 详细信息无论如何都不应该在您的应用中可见。
如果您不知道,COM 中还有一个 SUCCEEDED 宏。无需测试失败:)
【讨论】: