标准的Windows打开/保存对话框被WebKit破坏了。

7
我们的团队正在使用Qt 4.7.4开发一个复杂的应用程序。我们提供的关键功能之一需要在QWebBrowser中呈现HTML+JS内容。
问题在于,加载某些页面会导致打开/保存对话框出现故障:

enter image description here

该对话框在交互方面仍然“有效”:可以打开文件过滤器组合框,输入文件名,但所有这些都是错误的。文件列表和目录树根本没有被绘制。
我在Qt bug跟踪器和谷歌上找不到有关此问题的错误报告。我们决定该问题局限于我们的项目。我们认为某些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版本附带的分析器之外。 - Kuba hasn't forgotten Monica
3个回答

4

经过长时间的调查,我们发现破损窗口的真正原因是Flash插件DLL的加载。

我们发现在调试窗口中关于DLL加载的消息和对话框破裂的时刻之间存在相关性。对话框正好在加载Flash插件后破裂。

为了证实这个命题,我们将Flash DLL(NPSWF64_*.DLL)移动到另一个目录中,使得WebKit无法找到该插件,在应用程序重新启动后,对话框得以修复。


4

Qt 4.7(包括4.8)现在已经相当陈旧,不支持Windows> 7。据我所知,你应该切换到Qt 5。


谢谢你的回答!你说得完全正确,我们已经做了很多工作将我们的代码库迁移到Qt 5(已经进行了4个月),但这项工作直到下一个产品发布之前都不会完成,所以我们仍然需要Qt 4。 - Nipheris
那么,你试过4.8了吗?因为它仍然有点支持,所以可能支持Windows 8。不幸的是,我现在无法测试它。 - marius_linux

3

你尝试在另一台机器上运行应用程序了吗?就像我在使用Win 8的电脑时遇到了这个问题。几天里我不知道该怎么做,最终我在Win 7的电脑上尝试了一下,结果它可以运行。我原以为是我的电脑有问题,但看来不是这样。


感谢您的回答!目前,我们的开发人员和QA团队在每台Win 8.1机器上都能复现该问题。我们甚至在没有更新的Win 8.0上进行了测试,效果相同。不幸的是,该问题在Win 7或Win XP上从未被复现,但我现在无法对Win 10做出任何评论。 - Nipheris
顺便问一下,你的开发工具链是什么?你也在使用Qt吗,还是这个问题出现在另一个工具集中? - Nipheris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接