2015-09-04 125 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內部相關,請考慮在單獨的進程中運行打開/保存對話框。