标准窗口打开/保存对话框被WebKit打破
我们的团队正在开发一个使用Qt 4.7.4的复杂应用程序。我们提供的关键功能之一需要QWebBrowser呈现的HTML + JS内容。标准窗口打开/保存对话框被WebKit打破
的问题是,一些网页的加载导致破裂打开/保存对话框:
在互动方面的对话仍然是“作品”:文件过滤器组合框可以打开,文件名称可以输入,但所有这些都是错误的。文件列表和目录树根本没有绘制。
我发现在Qt bug跟踪器和谷歌上没有关于这个问题的bugreports。我们认为这个问题对我们的项目是本地的。我们假设某些comctl32.dll内部结构被某人的写操作毁于无效地址,但我们不知道如何捕捉真正的原因。 另外值得一提的是,这个问题并没有出现在Qt 5.4和任何版本的Windows上,都不到8.0。不幸的是,我们应该继续使用Qt 4.8构建下一个版本(该项目非常庞大,升级过程需要花费大量时间)。
如何调试此类问题?什么内存操作和/或WinAPI调用应该被挂钩?任何想法是高度赞赏。
工具链是MSVC 9.0(VS 2008)
那么,在花费大量时间进行调查后,我们发现导致Flash窗口被破坏的真正原因是加载了Flash插件DLL。
我们发现调试窗口中有关DLL加载的消息与中断对话的时刻之间的关联。加载Flash插件后,该对话框会完全中断。
为了确保这个建议,我们将Flash DLL(NPSWF64_*.DLL
)移到了另一个目录,以使WebKit无法找到插件,并且在应用程序重新启动对话框变得固定之后。
的Qt 4.7(4.8太)是很老旧了这些天。它不支持Windows> 7 AFAIK。你应该切换到Qt 5.
感谢您的回答!你是对的,我们已经做了很多工作来将我们的代码库移动到Qt 5(它已经持续了4个月),但是直到下一个产品发布才完成工作,所以我们仍然需要Qt 4 – Nipheris
那么,试过4.8?由于它仍然有点支持,它可能会支持Windows 8.我不能现在测试它,不幸的是。 –
有一个非常恶心的方式。如果您确定问题与内存损坏和qt内部相关,请考虑在单独的进程中运行打开/保存对话框。
如果您希望Qt 4.7能够在Windows 8及更高版本上运行,您需要自行维护(或为其购买自定义合同)。如果可能,您可以卸载并重新加载comctl32.dll。但最重要的是,这指向了Qt内存错误,或者(更可能)是代码中的内存错误。使用静态分析器来查看是否漏掉了任何明显的东西。这里有多个选项,但考虑到项目的规模,除了最新的Visual Studio版本之外,您至少应该使用PVS-Studio和Coverity。 –