- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个图像检测模块,它被封装为一个 COM 模块。我导出了一个 Key/Value Getter
API,例如:GetImageAttr(UINT key, void* pValue);
。我们的产品可能会或可能不会在图像上附加特殊结构,因此我的客户可以通过此 API 查询特定结构。
可能的用法如下:
ImageSpecialAttribute attr = {};
HRESULT hr = pImageDetector->GetImageAttr(IMAGE_SPECIAL_ATTRIBUTE, (void*)&attr);
如果图像确实有这样的附加结构,则返回 S_OK
是微不足道的。但如果没有,我应该返回 E_FAIL 还是 S_FALSE?
S_FALSE:一切正常,只是图像没有这样的可选属性。
E_FAIL:不!出了点问题。你不应该查询这个键。
已更新,(感谢 Remy Lebeau)
HRESULT_FROM_WIN32(ERROR_NOT_FOUND):不!不存在这样的元素/属性。
hr
来了解其含义。最佳答案
S_FALSE
是成功值,不是错误值。当方法本身成功但请求的数据不可用,或者请求的操作未执行时,许多 Microsoft 自己的 COM API 都会返回 S_FALSE
。 Microsoft 的文档中提到了这一点:
All of the constants with the prefix "E_" are error codes. The constants S_OK and S_FALSE are both success codes. Probably 99% of COM methods return S_OK when they succeed; but do not let this fact mislead you. A method might return other success codes, so always test for errors by using the SUCCEEDED or FAILED macro.
...
The success code S_FALSE deserves mention. Some methods use S_FALSE to mean, roughly, a negative condition that is not a failure. It can also indicate a "no-op"—the method succeeded, but had no effect. For example, the CoInitializeEx function returns S_FALSE if you call it a second time from the same thread. If you need to differentiate between S_OK and S_FALSE in your code, you should test the value directly, but still use FAILED or SUCCEEDED to handle the remaining cases...
我建议您遵循相同的约定,例如:
HRESULT hr = pImageDetector->GetImageAttr(IMAGE_SPECIAL_ATTRIBUTE, (void*)&attr);
if (SUCCEEDED(hr))
{
if (hr != S_FALSE)
{
// use attribute as needed...
}
else
{
// attribute not found...
}
}
else
{
// error...
}
如果您真的想为不存在的属性返回错误代码,我建议您为该特定条件定义自定义 HRESULT
,例如:
#define E_ATTR_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 1)
或者:
#define E_ATTR_NOT_FOUND HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
然后您可以将该错误返回给调用者,例如:
HRESULT hr = pImageDetector->GetImageAttr(IMAGE_SPECIAL_ATTRIBUTE, (void*)&attr);
if (SUCCEEDED(hr))
{
// use attribute as needed...
}
else if (hr == E_ATTR_NOT_FOUND)
{
// attribute not found...
}
else
{
// error...
}
COM 没有为“未找到”条件定义标准化错误 HRESULT 代码(HRESULT_FROM_WIN32(ERROR_NOT_FOUND)
将是最接近的标准等价物)。
关于c++ - E_FAIL or S_FALSE,哪个更适合表示没有这个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192311/
ID3D11Device* md3dDevice; ID3D11DeviceContext* md3dImmediateContext; D3D_DRIVER_TYPE md3dDriverType
当我在MFC应用程序中使用ATL时(不要问我为什么,只是因为我喜欢),有时我得到错误代码:E_FAIL。但是,我要定位具体原因几乎没有用。 我在谷歌上搜索了很多次,但没有找到任何相关内容。我认为 AT
我有一个小型应用程序,可以加载模型并在没有灯光或其他任何东西的情况下显示它。我一直在尝试构建一个版本并在另一台计算机上运行它,但 D3DX10CreateEffectFromFile 一直返回 E_F
我有一个图像检测模块,它被封装为一个 COM 模块。我导出了一个 Key/Value Getter API,例如:GetImageAttr(UINT key, void* pValue);。我们的产品
我使用 Kepware KEPServerEX 5.15 作为我的 OPC 服务器和 .NET 中的 OPC DA Automation Wrapper 2.02 进行通信。 当我的应用程序和 KEP
我在 Excel 中有一个非常简单的 VBA 代码,它使用 ADO 查询 MariaDB 数据库,然后将该记录集复制到 Excel 中。问题是当代码在某些机器上运行时,它运行良好,而在其他机器上它返回
请检查以下代码,它应该连接到当前正在运行的 Excel: #include #include #import "C:\Program Files (x86)\Common Files\micros
我有一个 Ubuntu 服务器,只花了 2 天时间将一个 22GB 的多部分存档传输到它。 22GB 被分成 1800 个 10MB 的部分。 每当我尝试提取它们时(p7zip 9.20): 7z x
在 VS-2017 中,单击“添加引用”时出现错误: "Error HRESULT E_FAIL has been returned from a call to a COM component."
我在自己的窗口中托管 Web 浏览器控件。以下是相关步骤: CoGetClassObject(CLSID_WebBrowser, CLSCTX_INPROC_SERV
MSDN(https://msdn.microsoft.com/en-us/library/04tsf4b5.aspx)说: Return Value Returns S_OK on success,
我刚开始阅读这本书并尝试实现一些 CSS 代码。每当我尝试创建一个新的 CSS 文件或打开一个 css 文件时,我都会收到以下错误:调用 COM 组件返回错误 HRESULT E_FAIL。 谁能告诉
我有一个 C++ 调用 C# 表单。它似乎工作正常。但是,当我打开 C# 项目窗体设计器时,会弹出以下错误消息。有什么问题。解决方案构建并运行良好。 调用 COM 组件返回错误 HRESULT E_F
我正在使用以下代码调用 D3D11CreateDevice(): ID3D11Device* md3dDevice; ID3D11DeviceContext* md3dImmediateContext
在 Silverlight 4 应用程序中;这个错误是什么意思?: "Error HRESULT E_FAIL has been returned from a call to a COM compo
你好, 我在使用一些简单的 VBA 时遇到了问题。我编写了一个脚本来进行文本查询(没有输入参数,因此没有真正的用户交互、SQL 注入(inject)等),针对数据库运行它,并将其转储到新的工作表中。这
我对Docker有问题。 我打开然后关闭了Hyper-v,这无济于事。 Hyper-v技术-开启(在BIOS中) I have this error 最佳答案 那对我有帮助: ''' 嘿伙计们,我也遇
我们在 Office 2007 中的 .NET 3.5 中开发了一个复杂的应用程序。在某些表单中,我们使用 WebBrowser 控件导航到我们的 HTML 页面。问题是在某些机器上,当控件调用“导航
我不知道这个“错误 HRESULT E_FAIL 已从对 COM 组件的调用返回”是怎么回事。各位知道怎么回事吗?我的 wcf 服务运行良好,但今天出现此错误。我在谷歌上搜索,但没有找到答案。 提前致
我的应用程序中有一些 UserControl,我需要支持从中拖放,因此我将代码提取到扩展 UserControl 的抽象类中(下面的代码)。当我在一个控件中使用它时,它是 ListBox 中 Data
我是一名优秀的程序员,十分优秀!