2015-09-04 111 views
6

我们的团队正在开发一个使用Qt 4.7.4的复杂应用程序。我们提供的关键功能之一需要QWebBrowser呈现的HTML + JS内容。标准窗口打开/保存对话框被WebKit打破

的问题是,一些网页的加载导致破裂打开/保存对话框:

enter image description here

在互动方面的对话仍然是“作品”:文件过滤器组合框可以打开,文件名称可以输入,但所有这些都是错误的。文件列表和目录树根本没有绘制。

我发现在Qt bug跟踪器和谷歌上没有关于这个问题的bugreports。我们认为这个问题对我们的项目是本地的。我们假设某些comctl32.dll内部结构被某人的写操作毁于无效地址,但我们不知道如何捕捉真正的原因。 另外值得一提的是,这个问题并没有出现在Qt 5.4和任何版本的Windows上,都不到8.0。不幸的是,我们应该继续使用Qt 4.8构建下一个版本(该项目非常庞大,升级过程需要花费大量时间)。

如何调试此类问题?什么内存操作和/或WinAPI调用应该被挂钩?任何想法是高度赞赏。

工具链是MSVC 9.0(VS 2008)

+0

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

回答

3

那么,在花费大量时间进行调查后,我们发现导致Flash窗口被破坏的真正原因是加载了Flash插件DLL。

我们发现调试窗口中有关DLL加载的消息与中断对话的时刻之间的关联。加载Flash插件后,该对话框会完全中断。

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

4

的Qt 4.7(4.8太)是很老旧了这些天。它不支持Windows> 7 AFAIK。你应该切换到Qt 5.

+0

感谢您的回答!你是对的,我们已经做了很多工作来将我们的代码库移动到Qt 5(它已经持续了4个月),但是直到下一个产品发布才完成工作,所以我们仍然需要Qt 4 – Nipheris

+0

那么,试过4.8?由于它仍然有点支持,它可能会支持Windows 8.我不能现在测试它,不幸的是。 –

3

你在另一台机器上试过了你的应用程序吗? 像这件事情也发生在我的时候,我正在打赢8机器。几天后,我不知道该怎么办,毕竟我已经尝试过赢取7台电脑,它工作。我认为我的机器出了问题,但看起来不是。

+0

谢谢你的回答!在这个时候,我们的开发人员和QA拥有的每台Win 8.1机器上都会重现这个问题。我们甚至在Win 8.0上进行了测试(没有更新),效果相同。这个问题从未在Win 7或Win XP上复制过,遗憾的是我现在无法对Win 10说什么。 – Nipheris

+0

顺便说一句,你的开发工具链是什么?你是否也在使用Qt,或者这个问题出现在另一个工具箱中? – Nipheris

0

有一个非常恶心的方式。如果您确定问题与内存损坏和qt内部相关,请考虑在单独的进程中运行打开/保存对话框。