【问题标题】:IWebBrowser2 blocks IFileDialogIWebBrowser2 块 IFileDialog
【发布时间】:2018-04-09 03:46:28
【问题描述】:

在我们的 32 位 Windows MFC 应用程序中,我们使用 IWebBrowser2 来显示 HTML 内容。我们也(因为 MFC 为我们做这件事,而且我们在 Windows 10 上运行)使用新的 IFileDialog COM 接口来打开公共文件对话框。

当我们在应用程序中有一个可见的网络浏览器窗口时,文件对话框将不会打开,或者会打开一次但再也不会打开,除非您关闭并再次备份应用程序。通常发生的是这个 MFC 调用:-

 HRESULT hr = (static_cast<IFileDialog*>(m_pIFileDialog))->Show(m_ofn.hwndOwner);

直接返回“0x800704c7操作被用户取消”,甚至不显示对话框。

关闭 HTML 视图/窗口允许 IFileDialog 按预期工作,因此这两个组件似乎在某种程度上相互干扰。

这种情况现在发生在我们几个月未更改的软件上,而且似乎仅限于 Windows 10,但我们无法在网上找到任何关于原因的线索。

大卫。

【问题讨论】:

  • 这没什么好说的。 IFileDialog 在脏机器上很麻烦,特别是开发机器通常安装了很多不稳定的 shell 扩展。你必须做一些跑腿工作并在其他机器上进行测试,越处女越好。如果它被证明是特定于机器的,那么使用 Sysinternals 的 AutoRuns 积极清理扩展是解决办法。
  • 我建议在虚拟机中安装全新的 Windows 进行测试。使用 VM 的快照功能,只需几秒钟即可启动操作系统并进行一些快速测试。对于这种情况真的非常宝贵。
  • 我们已经在使用虚拟机 (Hyper-V) 进行测试。例如,我有一个干净的香草 Win10 虚拟机,我刚刚安装了我们的软件,它表现出完全相同的问题。除了一些驱动程序(NVIDIA、SIS 等)和编解码器之类的东西之外,Autoruns 中没有显示 Microsoft 未预装的任何内容。
  • 另一个奇怪的事情是,构建了一个使用 CHtmlView 作为其视图类的新 MFC SDI 和 MDI 应用程序,它们工作得很好,并且允许文件对话框工作。这让我想知道这里是否存在一些微妙的构建问题,这意味着我们的主应用程序处于稍微不同的状态。它当然是一个更大的应用程序(1 个 exe 和 60 多个 DLL),但本质上它仍然是一个 MFC MDI 应用程序。

标签: c++ windows mfc iwebbrowser2


【解决方案1】:

我有这个答案。 a) 您调用-&gt;Show() 的语法完全错误。 b) 包含文件'shobjidl.h' 中有嵌套的守卫阻止处理IFileDialog COM 类的定义,因此许多人遇到编译错误,无法生成难以捉摸的输出.exe

在调用 ->Show 方法时,您基本上只需要以下位置:

HRESULT hr = pFileDialog->Show(NULL);

查看解释和示例程序:

https://github.com/InventorDave/IFileDialog-gcc-Fix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2018-08-05
    • 2023-03-09
    • 2011-04-12
    • 2012-12-07
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多