2015-09-04 19 views
6

Nhóm của chúng tôi đang phát triển một ứng dụng phức tạp sử dụng Qt 4.7.4. Một trong những chức năng chính mà chúng tôi cung cấp yêu cầu nội dung HTML + JS được hiển thị bởi QWebBrowser.Cửa sổ tiêu chuẩn mở/lưu hộp thoại bị hỏng bởi WebKit

Vấn đề là tải của một số trang dẫn đến sự phá vỡ mở/lưu các hộp thoại:

enter image description here

Hộp thoại vẫn "tác phẩm" về tương tác: combobox lọc tập tin có thể được mở ra, tập tin tên có thể được nhập, nhưng tất cả điều này được vẽ sai. Danh sách tệp và cây thư mục không được vẽ chút nào.

Tôi không tìm thấy báo cáo lỗi nào về vấn đề này trên trình theo dõi lỗi Qt và google. Chúng tôi quyết định rằng vấn đề là địa phương cho dự án của chúng tôi. Chúng tôi giả sử rằng một số cấu trúc bên trong comctl32.dll bị hủy hoại bởi hoạt động ghi của ai đó đến địa chỉ không hợp lệ, nhưng chúng tôi không biết làm thế nào để nắm bắt được nguyên nhân thực sự. Cũng cần lưu ý rằng vấn đề này KHÔNG xuất hiện với Qt 5.4 và trên bất kỳ phiên bản cửa sổ nào ít hơn 8.0. Thật không may, chúng ta nên xây dựng bản phát hành tiếp theo vẫn còn trên Qt 4.8 (dự án là rất lớn, quá trình nâng cấp mất khoảng thời gian đáng kể).

Làm cách nào để khắc phục sự cố như vậy? Những gì hoạt động bộ nhớ và/hoặc các cuộc gọi WinAPI nên được nối? Mọi ý tưởng đều được đánh giá cao.

Chuỗi công cụ là MSVC 9.0 (VS 2008)

+0

Nếu bạn muốn Qt 4.7 hoạt động trên Windows 8 trở lên, bạn sẽ tự mình duy trì nó (hoặc mua hợp đồng tùy chỉnh cho nó). Bạn có thể tải và tải lại comctl32.dll nếu có thể. Nhưng quan trọng nhất, điều này điểm hoặc là một lỗi bộ nhớ Qt, hoặc (nhiều khả năng) đến một lỗi bộ nhớ trong mã của bạn. Sử dụng các máy phân tích tĩnh để xem bạn có bỏ sót bất cứ điều gì rõ ràng không. Có rất nhiều ở đó, nhưng cho kích thước của dự án của bạn, bạn nên sử dụng ít nhất PVS-Studio và Coverity, ngoài một trong đó đi kèm với các phiên bản Visual Studio gần đây. –

Trả lời

3

Vâng, sau khi dành nhiều thời gian để điều tra, chúng tôi đã phát hiện ra nguyên nhân thực sự của cửa sổ bị hỏng đang tải Flash plugin DLL.

Chúng tôi đã tìm thấy mối tương quan giữa các thông báo về tải DLL trong cửa sổ Gỡ lỗi và thời điểm ngắt hộp thoại. Hộp thoại ngắt chính xác sau khi tải plugin Flash.

Để đảm bảo đề xuất này, chúng tôi đã chuyển Flash DLL (NPSWF64_*.DLL) sang một thư mục khác để làm cho WebKit không thể tìm thấy plugin và sau khi hộp thoại khởi động lại ứng dụng được sửa.

4

Qt 4.7 (4.8 quá) khá cũ và có nhiều bụi trong những ngày này. Nó không hỗ trợ Windows> 7 AFAIK. Bạn chắc chắn nên chuyển sang Qt 5.

+0

Cảm ơn bạn đã trả lời! Bạn hoàn toàn đúng, và chúng tôi đã thực hiện rất nhiều công việc để chuyển codebase của chúng tôi sang Qt 5 (đã mất 4 tháng), nhưng công việc sẽ không được hoàn thành cho đến khi bản phát hành tiếp theo, vì vậy chúng tôi vẫn cần Qt 4 – Nipheris

+0

Vậy thì, đã thử 4.8? Vì nó vẫn được hỗ trợ, nó hỗ trợ Windows 8. Tôi không thể kiểm tra nó ngay bây giờ, thật đáng buồn. –

3

Bạn đã thử ứng dụng của mình trên một máy khác chưa? Giống như điều này cũng happend để tôi trong khi tôi đã làm việc trên một máy giành chiến thắng 8. Đối với một vài ngày tôi không biết phải làm gì, và sau khi tất cả tôi đã thử nó trên win 7 pc và nó đã làm việc. Tôi nghĩ có gì đó không ổn với máy của mình nhưng có vẻ không phải vậy.

+0

Cảm ơn bạn đã trả lời! Tại thời điểm này vấn đề được sao chép trên mọi máy Win 8.1 mà các nhà phát triển và QA của chúng tôi có. Chúng tôi thậm chí đã thử nghiệm nó trên Win 8.0 (không có bản cập nhật) với cùng một hiệu ứng. Vấn đề là không bao giờ sao chép trên Win 7 hoặc Win XP, tiếc là tôi không thể nói bất cứ điều gì về Win 10 bây giờ. – Nipheris

+0

BTW, chuỗi công cụ phát triển của bạn là gì? Bạn đang sử dụng Qt quá, hoặc vấn đề này xuất hiện với một bộ công cụ khác? – Nipheris

0

Có một cách thực sự icky xung quanh. Nếu bạn chắc chắn rằng vấn đề có liên quan đến tham nhũng bộ nhớ và qt internals, hãy xem xét chạy mở/lưu hộp thoại trong quá trình riêng biệt.

Các vấn đề liên quan