2012-03-14 26 views
5

MSDN cho biết, đối với hàm CDialog.DoModal(), giá trị trả về là -1 nếu hàm không thể tạo hộp thoại. Nó không nói trong trường hợp nó có thể thất bại trong việc tạo hộp thoại.Khi chức năng CDialog.DoModal() thất bại trong việc tạo hộp thoại?

Điều tra nhanh về mã nguồn MFC cho thấy (LPCDLGTEMPLATE) LockResource (hDialogTemplate) trả về NULL, hàm DoModal có thể trả về -1.

Vì sự cố của tôi không thể sao chép ổn định trong thử nghiệm ứng suất của chúng tôi, tôi không thể gỡ lỗi chương trình để tìm nguyên nhân gốc. Có ai ở đây gặp vấn đề tương tự không?

+3

bạn _had_ để sử dụng MFC phải không? – ApprenticeHacker

+1

GetLastError nói gì? –

+0

@IntermediateHacker, chúng ta không biến điều này thành một "API đó hút, tại sao lại sử dụng nó" tranh luận, chúng ta sẽ ở đây cả ngày. –

Trả lời

4

DoModal() dựa trên chức năng API CreateDialogIndirect(). Các tài liệu cho anh em họ DialogBox() tiểu bang của mình rằng chức năng có thể thất bại trong các trường hợp sau đây:

  • một giá trị tham số không hợp lệ,
  • hệ thống lớp học đã được đăng ký bởi một mô-đun khác nhau,
  • móc WH_CBT được cài đặt và trả lại mã lỗi,
  • một trong các điều khiển trong mẫu hộp thoại không được đăng ký hoặc quy trình cửa sổ của nó không thành công trên WM_CREATE hoặc WM_NCCREATE.

Cá nhân tôi chưa bao giờ gặp ba lý do đầu tiên, nhưng tôi đã cắn một lúc bằng cách thứ tư vì hộp thoại của tôi chứa một điều khiển ActiveX mà không được đăng ký trên máy tính này. Có thể bạn đang gặp phải sự cố tương tự.

+0

MFC không sử dụng 'DialogBox', nó mô phỏng nó với các cuộc gọi khác. Tuy nhiên, một số thông tin trong câu trả lời này vẫn hữu ích. –

+0

@ Mark, bạn hoàn toàn đúng, nó sử dụng 'CreateDialogIndirect()' ngay cả đối với các hộp thoại phương thức, và thực hiện chính trạng thái phương thức. Tôi tự hỏi tại sao, nhưng có lẽ là một lý do chính đáng. Cảm ơn bạn đã làm rõ :) –

+1

Tôi đã thực hiện cuộc gọi DoModal sau khi thay đổi ngôn ngữ: tài nguyên mới đã bỏ sót một số id mà tài nguyên gốc đã có. Tôi báo cáo điều này hy vọng sẽ đưa ra gợi ý cho những người khác trong vấn đề tương tự. – Zac

0

Tôi tìm thấy nguyên nhân gốc xuất phát từ các đối tượng GDI đã cạn kiệt. Phần mềm của chúng tôi tồn tại xử lý rò rỉ. Số lượng đối tượng GDI tối đa có thể được đặt trong sổ đăng ký. Giá trị là 16000 trong Windows XP của chúng tôi. Tôi đã viết một chương trình để tạo nhiều điều khiển giao diện người dùng và không giải phóng chúng. Bằng cách này tôi có thể mô phỏng tình trạng mệt mỏi xử lý GDI. Kết quả là, cùng một vấn đề được sao chép lại.

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota

Ref: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

Vậy là nó kết luận cuối cùng rằng khi các đối tượng GDI đang cạn kiệt, một số điều khiển giao diện người dùng như CDialog, sẽ không tạo được?

+0

Xử lý cạn kiệt là một vấn đề nổi tiếng trên Win32 khi chạy/gỡ lỗi các ứng dụng với GUI phức tạp (CAD, EDA). Trên Win64, chúng tôi đã không mong đợi vấn đề Out of Handles. – BlackBada

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