2015-09-04 4 views
6

Наша команда разрабатывает сложное приложение с использованием Qt 4.7.4. Одна из ключевых функций, которые мы предоставляем, требует содержимого HTML + JS, предоставленного QWebBrowser.Открыт диалог открытия/сохранения стандартных окон WebKit

Проблема заключается в том, что загрузка некоторых страниц приводит к сломанным диалогам открытия/сохранения:

enter image description here

Диалог еще «работает» с точкой зрения взаимодействия: выпадающий список файлов фильтра может быть открыт, файл имя может быть введено, но все это неверно. Дерево файлов и дерево каталогов вообще не нарисованы.

Я не нашел ошибок в этой проблеме на Qt tracker и google. Мы решили, что проблема локальна для нашего проекта. Мы предполагаем, что некоторые внутренние структуры 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, либо (скорее) на ошибку памяти в вашем коде. Используйте статические анализаторы, чтобы убедиться, что вы пропустили что-то очевидное. Есть несколько вариантов, но, учитывая размер вашего проекта, вы должны использовать как минимум PVS-Studio и Coverity, отдельно от той, которая поставляется с последними версиями Visual Studio. –

ответ

3

Хорошо, потратив много времени на исследования, мы обнаружили, что настоящей причиной разбитых окон является загрузка DLL Flash-плагина.

Мы нашли корреляцию между сообщениями о загрузке 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

Спасибо за ответ! В настоящий момент проблема воспроизводится на каждой машине Win 8.1, которую разработчики и QA имеют. Мы даже протестировали его на Win 8.0 (без обновления) с тем же эффектом. Проблема никогда не воспроизводится на Win 7 или Win XP, к сожалению, я ничего не могу сказать о Win 10 сейчас. – Nipheris

+0

BTW, какова ваша разработка toolchain? Вы тоже используете Qt, или эта проблема появилась с другим набором инструментов? – Nipheris

0

Существует очень нехороший путь. Если вы уверены, что проблема связана с повреждением памяти и внутренними компонентами qt, попробуйте запустить диалог открытия/сохранения в отдельном процессе.