如何从 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
在备注部分引用了CreateWindow
,CreateWindow
通过GetLastError
提供了额外的错误信息。不过,我不知道这是否意味着CWindow::Create
也一样。不过,我找不到任何接受您传递的参数的东西,只是 CAxWindow
派生自 CWindow
。
【参考方案1】:
错误代码完全是特定于功能的。想想return E_FAIL;
的一段代码[在另一边] 可以从中获得什么额外的细节?很有可能你根本没有细节。
有时您可以使用GetErrorInfo
API 获取其他信息,在您的情况下(考虑到您的代码 sn-p)不太可能。
你能做的最好的就是走进去尽可能接近代码的源头,以便知道它来自哪里。
【讨论】:
你确实解决了我的问题。我逐行调试代码,发现如果定义了宏_ATL_DLL,一切正常。非常感谢您的建议。【参考方案2】:使用_com_error
类。
通过传入HRESULT
值构造该类的对象,然后使用其WCode
或ErrorMessage
方法获取映射到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 错误的详细信息?
如何获取带有错误请求状态代码的详细信息(自定义错误消息)?这样我就可以对其进行断言