2015-09-04 7 views
6

Unser Team entwickelt eine komplexe Anwendung mit Qt 4.7.4. Eine der von uns bereitgestellten Schlüsselfunktionen erfordert HTML- und JS-Inhalte, die von QWebBrowser gerendert werden.Standardfenster zum Öffnen/Speichern wird durch WebKit unterbrochen

Das Problem ist, dass das Laden von einigen Seiten führt zu den aufgebrochenen/Speichern-Dialoge:

enter image description here

Der Dialog nach wie vor „Werke“ in Bezug auf die Interaktion: die Dateifilter Combobox geöffnet werden kann, Datei Name kann eingegeben werden, aber das alles wird falsch gezeichnet. Dateiliste und Verzeichnisbaum werden überhaupt nicht gezeichnet.

Ich habe keine Bugreports zu diesem Problem auf Qt Bug Tracker und Google gefunden. Wir haben entschieden, dass das Problem lokal für unser Projekt ist. Wir nehmen an, dass einige interne comctl32.dll-Strukturen durch die Schreiboperation einer Person in eine ungültige Adresse ruiniert werden, aber wir haben keine Ahnung, wie wir den wahren Grund finden. Es ist auch erwähnenswert, dass dieses Problem nicht mit Qt 5.4 und auf jeder Version von Windows weniger als 8.0 erscheint. Leider sollten wir die nächste Version noch auf Qt 4.8 erstellen (das Projekt ist riesig, der Upgrade-Prozess benötigt viel Zeit).

Wie ein solches Problem kann debuggt werden? Welche Speicheroperationen und/oder WinAPI-Aufrufe sollten angehängt werden? Irgendwelche Ideen werden sehr geschätzt.

Die Toolchain ist MSVC 9.0 (VS 2008)

+0

Wenn Sie möchten, dass Qt 4.7 unter Windows 8 oder höher funktioniert, müssen Sie es selbst pflegen (oder einen benutzerdefinierten Vertrag dafür kaufen). Sie könnten comctl32.dll entladen und neu laden, wenn möglich. Am wichtigsten ist jedoch, dass dies entweder auf einen Qt-Speicherfehler oder (wahrscheinlich) auf einen Speicherfehler in Ihrem Code hinweist. Verwenden Sie statische Analysatoren, um festzustellen, ob Sie etwas übersehen haben. Es gibt mehrere da draußen, aber angesichts der Größe Ihres Projekts sollten Sie mindestens PVS-Studio und Coverity verwenden, abgesehen von dem, das mit den neuesten Visual Studio-Versionen geliefert wird. –

Antwort

3

Nun, nachdem wir viel Zeit für Untersuchungen aufgewendet haben, haben wir entdeckt, dass der eigentliche Grund für zerbrochene Fenster das Laden der Flash Plugin DLL ist.

Wir haben die Korrelation zwischen den Meldungen über das Laden von DLL im Debug-Fenster und dem Moment des Abbrechens des Dialogs gefunden. Der Dialog bricht genau nach dem Laden des Flash-Plugins ab.

Um diesen Vorschlag zu gewährleisten, haben wir die Flash-DLL (NPSWF64_*.DLL) in ein anderes Verzeichnis verschoben, damit WebKit das Plugin nicht finden konnte. Nach dem Neustart der Anwendung wurden die Dialoge repariert.

4

Qt 4.7 (4.8 auch) ist ziemlich alt und verstaubt in diesen Tagen. Es unterstützt nicht Windows> 7 AFAIK. Sie sollten definitiv zu Qt 5 wechseln.

+0

Danke für die Antwort! Sie haben absolut Recht, und wir haben bereits viel Arbeit geleistet, um unsere Codebase auf Qt 5 zu verschieben (es dauert schon 4 Monate), aber die Arbeit wird erst mit der nächsten Produktversion abgeschlossen sein, also brauchen wir noch Qt 4 – Nipheris

+0

Na dann, habe ich 4.8 probiert? Da es immer noch irgendwie unterstützt wird, könnte es Windows 8 unterstützen. Ich kann es leider gerade nicht testen. –

3

Haben Sie Ihre Anwendung auf einer anderen Maschine ausprobiert? Wie diese Sache auch zu meinem geschah, während ich an einer Maschine des Gewinns 8 arbeitete. Für ein paar Tage wusste ich nicht, was zu, und nach allem, was ich es versucht habe, zu gewinnen 7 pc und es hat funktioniert. Ich dachte, dass etwas mit meiner Maschine nicht stimmt, aber es sieht so aus.

+0

Vielen Dank für die Antwort! In diesem Moment wird das Problem auf jeder Win 8.1-Maschine reproduziert, die unsere Entwickler und QA's haben. Wir haben es sogar mit Win 8.0 (ohne Update) mit dem gleichen Effekt getestet. Das Problem wird nie auf Win 7 oder Win XP reproduziert, leider kann ich jetzt nichts über Win 10 sagen. – Nipheris

+0

BTW, was ist Ihre Entwicklungs-Toolchain? Verwenden Sie Qt auch, oder dieses Problem trat mit einem anderen Toolset auf? – Nipheris

0

Es gibt einen wirklich ekligen Weg herum. Wenn Sie sicher sind, dass das Problem mit der Speicherbeschädigung und den Interna von qt zusammenhängt, sollten Sie den Dialog zum Öffnen/Speichern in einem separaten Prozess ausführen.

Verwandte Themen