【问题标题】:How to avoid console output about unsupported operations ? (IWebBrowser2, DISP_E_MEMBERNOTFOUND)如何避免有关不受支持的操作的控制台输出? (IWebBrowser2,DISP_E_MEMBERNOTFOUND)
【发布时间】:2011-08-27 11:04:00
【问题描述】:

上下文: 我正在尝试使用 IWebBrowser2 创建用于查看本地 html 文件的小型嵌入式浏览器。我在 MFC 和 CWnd::CreateControl 的帮助下做这件事。一切都很好,除了一个时刻:当我单击 html 链接时,我收到关于 COleException 的消息(到 Visual C++ 调试控制台)已被抛出。浏览器打开链接很好,没有其他可观察到的效果,除了控制台中的消息
我能追踪投掷的地方。有调用堆栈:

AfxThrowOleException(...)
COleDispatchDriver::InvokeHelperV(...)
COleControlSite::InvokeHelperV(...)
COleControlSite::InvokeHelper(...)
COleControlSite::GetProperty(...)
COleControlSite::GetStyle(...) 
CWnd::GetStyle(...)
CWnd::OnDisplayChange(...)
CWnd::OnSettingChange(...)
CWnd::OnWndMsg(...)
CWnd::WindowProc(...)
AfxCallWndProc(...)
CWnd::SendMessageToDescendants(...)CWnd::SendMessageToDescendants(...)
CWnd::OnDisplayChange(...)
CWnd::OnSettingChange(...)
CDialog::OnSettingChange(...)
CWnd::OnWndMsg(...)
CWnd::WindowProc(...)
AfxCallWndProc(...)
AfxWndProc(...)
经过一番调查,我知道 MFC 尝试为 IWebBrowser 的 IDispatch 调用“Invoke”以接收 Web 浏览器控件的“ENABLED”状态。轮流通过返回值进行控制告诉我们 不能满足这样的要求。 MFC 抛出异常(并自行捕获)并污染调试输出。
问题:我可以做些什么来避免或禁止显示此消息?

附加信息: 这是错误信息:

Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
RaiseException: Thread=9f84aba4 Proc=8c24c980 'HtmlHelpBrowser.exe'
AKY=00000401 PC=03fb542c(coredll.dll+0x0004542c) RA=8000a700(NK.EXE+0x00009700) BVA=00000001 FSR=00000001

我正在使用 Visual C++ 9.0 在 Windows CE 5.0 上完成所有这些工作。

【问题讨论】:

    标签: c++ com mfc activex ole


    【解决方案1】:

    原因:COleControlSite::GetStyle() 检查 DISPID_ENABLED 和 DISPID_BORDERSTYLE,IE 没有实现的两个调度 ID。 GetStyle 调用就在调用堆栈上。

    解决方案:

    • 忽略调试输出,或
    • 从 COleControlSite 派生一个类以覆盖 GetStyle,复制 COleControlSite::GetStyle 的实现,除了那些从 ActiveX 读取样式的行。然后 override CreateControlSite 在 webbrowser 的父窗口的类中并使用新的控制站点。对于 VC6 或更早版本,CWnd::CreateControlSite 不存在,overriding the control container is required

    【讨论】:

    • 嗨!非常感谢您的回答,第二个解决方案很好地解决了我的问题。它有一个小缺点:我基于 IWebBrowser2 的控件(对话框等)的所有主机都应该实现 CreateControlSite 方法。是否有任何变体可以将 CreateControlSite 封装在基于 IWebBrowser2 的控件中?
    • 您可以从 CDialog 派生一个类并在其中添加 CreateControlSite 实现,然后将该类用作对话框的基类。
    • 会将此视为一种方式。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多