如何从 E_FAIL 获取详细的错误信息?

Posted

技术标签:

【中文标题】如何从 E_FAIL 获取详细的错误信息?【英文标题】:How to get detail error info from E_FAIL? 【发布时间】:2012-12-26 19:50:51 【问题描述】:

当我在 MFC 应用程序中使用 ATL 时(不要问我为什么,只是因为我喜欢),有时我会收到错误代码:E_FAIL。但是,我几乎找不到具体原因。

我用谷歌搜索了很多次,但没有找到相关的。我认为 ATL 中应该有类似 try catch 的东西。

这里有一些示例代码:

CAxWindow  m_wndView;  // ActiveX host window class.
CComPtr<IWMPPlayer>  m_spWMPPlayer;  // Smart pointer to IWMPPlayer interface.

AtlAxWinInit();
CComPtr<IAxWinHostWindow>  spHost;
HRESULT  hr;
CRect rcClient;
GetClientRect(&rcClient);
m_wndView.Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
//when I switch to Static Link to ATL from Dynamic Link to ATL, I always get E_FAIL
hr = m_wndView.QueryHost(&spHost);

谁能帮帮我?

【问题讨论】:

我已经更新了帖子,请检查并提出您的建议。 嗯,我不确定,但是CWindow::Create 在备注部分引用了CreateWindowCreateWindow 通过GetLastError 提供了额外的错误信息。不过,我不知道这是否意味着CWindow::Create 也一样。不过,我找不到任何接受您传递的参数的东西,只是 CAxWindow 派生自 CWindow 【参考方案1】:

错误代码完全是特定于功能的。想想return E_FAIL; 的一段代码[在另一边] 可以从中获得什么额外的细节?很有可能你根本没有细节。

有时您可以使用GetErrorInfo API 获取其他信息,在您的情况下(考虑到您的代码 sn-p)不太可能。

你能做的最好的就是走进去尽可能接近代码的源头,以便知道它来自哪里。

【讨论】:

你确实解决了我的问题。我逐行调试代码,发现如果定义了宏_ATL_DLL,一切正常。非常感谢您的建议。【参考方案2】:

使用_com_error 类。 通过传入HRESULT 值构造该类的对象,然后使用其WCodeErrorMessage 方法获取映射到HRESULT 值的错误代码。

【讨论】:

感谢您的回复。我按照你说的做了,但我只收到错误消息:未指定的错误。这是我的代码:_com_error err(hr);自动 d = err.WCode();自动 s = err.Description(); auto msg = err.ErrorMessage();//未指定错误 在你使用 _com_error(HRESULT, IErrorInfo, bool) 构造函数之前,这永远不会变得更好。 QI for ISupportErrorInfo 首先检查它是否可用,然后调用 GetErrorInfo()

以上是关于如何从 E_FAIL 获取详细的错误信息?的主要内容,如果未能解决你的问题,请参考以下文章

IIS7 + PHP5.3.16 + Plesk 如何获取 500 错误的详细信息?

如何获取带有错误请求状态代码的详细信息(自定义错误消息)?这样我就可以对其进行断言

如何在突触分析工作区的日志分析工作区中获取错误详细信息日志

获取导致异常的表单名称、方法名称和更多详细信息

如何从用于 vm 的 Azure Python SDK 获取 OS 磁盘相关的详细信息

如何从像 Asp.Net 这样的堆栈跟踪中获取“源错误”?