【问题标题】:Standard windows open/save dialog is broken by WebKitWebKit 破坏了标准窗口打开/保存对话框
【发布时间】:2015-11-30 10:45:15
【问题描述】:

我们的团队正在使用 Qt 4.7.4 开发一个复杂的应用程序。我们提供的关键功能之一需要由 QWebBrowser 呈现的 HTML+JS 内容。

问题是加载某些页面会导致打开/保存对话框损坏:

对话框在交互方面仍然“有效”:可以打开文件过滤器组合框,可以输入文件名,但所有这些都画错了。完全不绘制文件列表和目录树。

我在 Qt 错误跟踪器和谷歌上没有发现关于这个问题的错误报告。我们认为问题是我们项目的本地问题。我们假设某些 comctl32.dll 内部结构被某人对无效地址的写操作破坏了,但我们不知道如何找出真正的原因。 另外值得一提的是,这个问题不会出现在 Qt 5.4 和低于 8.0 的任何 Windows 版本上。不幸的是,我们应该在 Qt 4.8 上构建下一个版本(项目很大,升级过程需要大量时间)。

如何调试这样的问题?应该挂钩哪些内存操作和/或 WinAPI 调用?任何想法都受到高度赞赏。

工具链是 MSVC 9.0 (VS 2008)

【问题讨论】:

  • 如果您希望 Qt 4.7 在 Windows 8 及更高版本上运行,您需要自己维护它(或为其购买自定义合同)。如果可能,您可以卸载并重新加载 comctl32.dll。但最重要的是,这要么指向 Qt 内存错误,要么(更有可能)指向代码中的内存错误。使用静态分析器来查看您是否遗漏了任何明显的东西。那里有多种,但考虑到您的项目的大小,您应该至少使用 PVS-Studio 和 Coverity,除了最近的 Visual Studio 版本。

标签: c++ qt winapi webkit qwebview


【解决方案1】:

如今,Qt 4.7(4.8 也是)已经相当陈旧且尘土飞扬。它不支持 Windows > 7 AFAIK。您绝对应该切换到 Qt 5。

【讨论】:

  • 感谢您的回答!你说得对,我们已经做了很多工作来将我们的代码库迁移到 Qt 5(它已经持续了 4 个月),但是工作要到下一个产品发布才能完成,所以我们仍然需要 Qt 4 .
  • 那么,试过4.8了吗?由于它仍然受支持,它可能支持 Windows 8。遗憾的是,我现在无法对其进行测试。
【解决方案2】:

您是否在另一台机器上尝试过您的应用程序? 我在win 8机器上工作时也发生了这样的事情。几天来我不知道该怎么做,毕竟我在win 7 pc上试过它,它工作。我以为我的机器出了点问题,但看起来不是。

【讨论】:

  • 感谢您的回答!目前,我们的开发人员和 QA 拥有的每台 Win 8.1 机器上都会重现该问题。我们甚至在 Win 8.0(没有更新)上进行了测试,效果相同。这个问题在 Win 7 或 Win XP 上从未重现,不幸的是我现在不能说关于 Win 10 的任何事情。
  • 顺便说一句,你的开发工具链是什么?您是否也在使用 Qt,或者这个问题出现在另一个工具集上?
【解决方案3】:

嗯,经过大量的调查,我们发现导致窗口崩溃的真正原因是加载了Flash插件DLL。

我们发现 Debug 窗口中有关 DLL 加载的消息与中断对话框的时刻之间存在相关性。该对话框在加载 Flash 插件后完全中断。

为确保这一提议,我们将 Flash DLL (NPSWF64_*.DLL) 移动到另一个目录以使 WebKit 无法找到插件,并且在应用程序重新启动后对话框得到修复。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多