题
当您拥有的只是 HRESULT 时,我不知道从哪里可以获得有关含义、可能原因以及解决 COM 错误的可能解决方案的最佳信息。
搜索Google的术语“ 80004027”几乎是无用的,因为它会将您带到90%的时间,即“ 80004027是什么意思?”的随机讨论组?没有回答。
有什么好的资源可以做到这一点?为什么 MSDN 不是 Google 搜索结果的顶部?
解决方案
我总是使用 WinError.h。其中包含绝大多数 Windows 各种错误代码。
需要注意的一个关键指标是代码的 Facility 部分:第二个最高有效字节。即 0x80nnmmmm,其中 nn 是设施。这会告诉您哪个组件生成了代码。任何带有 7 的设施都是重新打包为 HRESULT 的 Windows 错误代码,您应该将低位字转换为十进制并在 WinError.h 中查找它。还有一些错误范围出现在它们自己的标题中(例如12000 - 12999 之间的任何内容都是 WinInet 错误代码,您应该在 WinInet.h 中查找它。
查找错误代码将为您提供符号名称,该名称可能在比代码本身或错误消息的措辞更多的文档中找到。
FACILITY_ITF(其值为 4,因此这些 HRESULT 从 0x8004 开始)表示错误是由您正在使用的接口定义的;您必须检查该界面才能了解其含义。
最后,COM 还提供了接口 IErrorInfo 来检索扩展的错误信息:调用 GetErrorInfo 检索错误对象。您必须查询 ISupportErrorInfo 并调用该接口的 InterfaceSupportsErrorInfo 方法来确定您调用的接口是否实际设置了错误对象(当然,如果它是模板代码,则它可能在撒谎)。
其他提示
%PROGRAMFILES%[某些版本的 Visual Studio] ools Common7\ 文件夹中的错误查找 (ErrLook.exe) 会经常(但并非总是)向您提供错误消息:
|---------------------------------------------------| | [] Error Lookup | |---------------------------------------------------| | Value: [0x80004027] | | | | Error Message | | +---------------------------------------------+ | | |The component or application containing the | | | |component has been disabled | | | | | | | +---------------------------------------------+ | | [Modules...] [Look up] [Close] [Help] | |----------------------------------------------------
如果这不起作用,您可以遵循这里的一些想法:http://blogs.msdn.com/oldnewthing/archive/2008/09/01/8914664.aspx
(错误查找简单地调用format_message_from_system标志的formatMessage())
如果 COM 错误不是系统错误,您可能还需要检查引发错误的组件的文档。
如果您在代码中捕获错误,您可以希望组件实现丰富的错误(GetErrorInfo(),与 VB 中的 Err 对象相同),以便您可以获得描述问题的完整消息。
来自 Prakash 的良好链接(我不知道 RCNr 的东西 - 我认为这些字节是该设施的一部分 - 但这似乎只在 16 位 Windows 中是正确的。)
通常,这些未知代码特定于您正在使用的接口/组件。该设施将设置为 FACILITY_ITF。我有一个旧程序 HRPlus (关联?) 解析 HRESULT。
COM 错误代码的结构
COM 错误代码在 Google 结果中排名第二。