Когда функция CDialog.DoModal () не может создать диалоговое окно? - PullRequest
6 голосов
/ 14 марта 2012

В MSDN сказано, что для функции CDialog.DoModal () возвращаемое значение равно –1, если функции не удалось создать диалоговое окно.В нем не указано, в каком случае не удалось создать диалоговое окно.

Быстрое исследование исходного кода MFC показывает, если (LPCDLGTEMPLATE) LockResource (hDialogTemplate) возвращает NULL, функция DoModal может вернуть -1.

Поскольку моя проблема не может быть стабильно воспроизведена в нашем стресс-тесте, я не могу отладить программу, чтобы найти основную причину.Кто-нибудь здесь сталкивался с подобной проблемой?

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

DoModal() использует API-функцию CreateDialogIndirect () .Документация для его двоюродного брата DialogBox () гласит, что функция может выйти из строя при следующих обстоятельствах:

  • недопустимое значение параметра,
  • системный классбыл зарегистрирован другим модулем,
  • хук WH_CBT установлен и возвращает код ошибки,
  • один из элементов управления в шаблоне диалога не зарегистрирован, или его оконная процедура не выполненаWM_CREATE или WM_NCCREATE.

Лично я никогда не сталкивался с первыми тремя причинами, но меня укусила однажды четвертая, потому что мое диалоговое окно содержало элемент управления ActiveX, который не был зарегистрирован вмашина.Возможно, вы столкнулись с той же проблемой.

0 голосов
/ 19 марта 2012

Я обнаружил, что причина кроется в исчерпанных объектах GDI. Наше программное обеспечение существует для устранения утечек. Максимальное количество объектов GDI может быть установлено в реестре. Значение составляет 16000 в нашей Windows XP. Я написал программу для создания множества элементов управления пользовательским интерфейсом, а не для их освобождения. Таким образом я могу смоделировать изнурительную ситуацию с рукояткой GDI. В результате та же проблема воспроизводится снова.

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ GDIProcessHandleQuota

Ссылка: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

Итак, является ли окончательный вывод, что, когда объекты GDI исчерпаны, некоторые элементы управления пользовательским интерфейсом, такие как CDialog, не будут созданы?

...