5

当您只有 HRESULT 时,我不知道从哪里获得有关解决 COM 错误的含义、可能原因和可能解决方案的最佳信息。

在 Google 上搜索“80004027”之类的术语几乎毫无用处,因为它会将您发送到 90% 的随机讨论组,问题是“80004027 是什么意思?” 没有回答。

这有什么好的资源?为什么 MSDN 不是 Google 的顶级搜索结果?

4

4 回答 4

6

我总是使用 WinError.h。这具有绝大多数的各种 Windows 错误代码。

需要注意的一个关键指标是代码的 Facility 部分:第二个最重要的字节。即 0x80nnmmmm,其中 nn 是 Facility。这会告诉您哪个组件生成了代码。设施为 7 的任何内容都是重新打包为 HRESULT 的 Windows 错误代码,您应该将低位字转换为十进制并在 WinError.h 中查找。还有一些错误范围出现在它们自己的标题中(例如,从 12000 到 12999 的任何内容都是 WinInet 错误代码,您应该在 WinInet.h 中查找它)。

查找错误代码将为您提供符号名称,它可能在比代码本身或错误消息的措辞更多的文档中找到。

FACILITY_ITF(其值为 4,因此这些 HRESULT 开始于 0x8004)表示错误是由您正在使用的接口定义的;您必须检查该界面以了解其含义。

最后,COM 还提供了接口 IErrorInfo 来检索扩展的错误信息:调用 GetErrorInfo 来检索错误对象。您必须查询 ISupportErrorInfo 并调用该接口的 InterfaceSupportsErrorInfo 方法来确定您调用的接口是否实际设置了错误对象(当然,如果它是模板代码,它可能是在撒谎)。

于 2008-09-15T21:12:49.860 回答
5

%PROGRAMFILES%[Some version of Visual Studio]\Tools Common7\ 文件夹中的错误查找 (ErrLook.exe) 会经常给您错误消息,但并非总是如此:

    |------------------------------------------------- --|
    | [] 错误查找 |
    |------------------------------------------------- --|
    | 值:[0x80004027] |
    | |
    | 错误信息 |
    | +---------------------------------------------+ |
    | |包含 | 的组件或应用程序 |
    | |组件已被禁用 | |
    | | | |
    | +---------------------------------------------+ |
    | [模块...] [查找] [关闭] [帮助] |
    |------------------------------------------------- ---

如果这不起作用,您可以从这里遵循一些想法:http: //blogs.msdn.com/oldnewthing/archive/2008/09/01/8914664.aspx

(错误查找只需使用 FORMAT_MESSAGE_FROM_SYSTEM 标志调用 FormatMessage())

如果 COM 错误不是系统错误,您可能还必须检查引发错误的组件的文档。

如果您在代码中发现错误,您可以希望组件实现丰富的错误(GetErrorInfo(),与 VB 中的 Err 对象相同),这样您就可以获得描述问题的完整消息。

于 2008-09-15T21:04:45.217 回答
0

COM 错误代码的结构

COM 错误代码在 Google 结果中排名第二。

于 2008-09-09T14:49:01.393 回答
0

来自 Prakash 的良好链接(我不知道 RCNr 的东西——我认为这些字节是设施的一部分——但这似乎只在 16 位 Windows 中是正确的。)

这些未知代码通常特定于您正在使用的接口/组件。该设施将设置为 FACILITY_ITF。我有一个解析 HRESULT 的旧程序 HRPlus(链接?)。

于 2008-09-09T14:59:43.770 回答