当您只有 HRESULT 时,我不知道从哪里获得有关解决 COM 错误的含义、可能原因和可能解决方案的最佳信息。
在 Google 上搜索“80004027”之类的术语几乎毫无用处,因为它会将您发送到 90% 的随机讨论组,问题是“80004027 是什么意思?” 没有回答。
这有什么好的资源?为什么 MSDN 不是 Google 的顶级搜索结果?
我总是使用 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 方法来确定您调用的接口是否实际设置了错误对象(当然,如果它是模板代码,它可能是在撒谎)。
%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 对象相同),这样您就可以获得描述问题的完整消息。
COM 错误代码在 Google 结果中排名第二。
来自 Prakash 的良好链接(我不知道 RCNr 的东西——我认为这些字节是设施的一部分——但这似乎只在 16 位 Windows 中是正确的。)
这些未知代码通常特定于您正在使用的接口/组件。该设施将设置为 FACILITY_ITF。我有一个解析 HRESULT 的旧程序 HRPlus(链接?)。