Что может вызвать сбой отложенного начала CreateDialogIndirect () с GetLastError () == 0 - PullRequest
0 голосов
/ 01 февраля 2020

У меня действительно странная проблема с приложением MF C C ++ x86, где через некоторое время начинают появляться сбои диалогов. Приложение работает нормально в течение нескольких часов, после чего некоторые диалоги не открываются. Нет заметного события или всплеска активности, которые могли бы разумно объяснить, почему начинают появляться сбои. Эта проблема затрагивает многие (но не все) диалоговые окна различной сложности: от простого входа в систему до сложных бизнес-диалогов со многими сложными элементами управления. Диалоги, которые работают, также различаются по сложности. Нет очевидных различий между диалоговыми окнами, которые работают, и теми, которые не работают.

Когда я ставлю точку останова на AfxWndPro c (внутри wincore. cpp) и активирую ее только после ввода CreateDialogIndirect (), это ударить следующим образом:

Хорошее поведение (первые несколько часов до того, как оно сломается):
WM_NCCREATE (0x0081) - Возвращает 1
WM_NCCALCSIZE (0x0083) - Возвращает 0
WM_CREATE (0x0001) - Возвращает 0
WM_SIZE (0x0005) - Возвращает 0
WM_MOVE (0x0003) - Возвращает 0
WM_SETFONT (0x0030) - Возвращает 0
WM_INITDIALOG (0x0110) - Возвращает 1

После этого происходит поток других сообщений (вероятно, связанных с инициализацией отдельных элементов управления), прежде чем CreateDialogIndirect () в конце концов вернется с допустимым hWnd, а GetLastError () вернет 0

Как только он перейдет в плохое состояние:
WM_NCCREATE (0x0081) - возвращает 1
WM_NCCALCSIZE (0x0083) - возвращает 0
WM_CREATE (0x0001) - возвращает 0
WM_SIZE (0x0005) - возвращает 0
W M_MOVE (0x0003) - возвращает 0
WM_SETFONT (0x0030) - возвращает 0
WM_UAHDESTROYWINDOW (0x0090) - возвращает 0
WM_DESTROY (0x0002) - возвращает 0
WM_NCDESTROY (0_000000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x1082) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x1082) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x0000) 0 (0x10000) CreateDialogIndirect () возвращает null, а GetLastError () возвращает 0

Я исследовал следующие потенциальные причины:

  • GDI-дескрипторы: похоже, низкий (менее 600)
  • Недопустимый / неправильный элемент управления: изначально все диалоговые окна работают, поэтому вряд ли это будет связано с пользовательским элементом управления или шаблоном диалога.
  • Классы становятся незарегистрированными: я пытался установить точки останова внутри вызовов MF C UnregiserClass. Они запускаются только при выходе из приложения.

Некоторая дополнительная справочная информация, которая может иметь отношение (или нет):

  • Это win32 MF C x86 Приложение с динамической связью.
  • Приложение является довольно сложным (т.е. более 50 диалогов, сложные элементы управления сеткой, фоновая потоковая передача входящих данных, несколько модулей - каждый в своей собственной DLL, Dynami c загрузка библиотек языковых ресурсов).
  • Исходная база кода был обновлен с помощью нескольких версий MSV C (с 2005 по 2019)
  • Мы столкнулись с проблемой в экземпляре, построенном с VS2013, но с тех пор обновили проект до VS2019 (VC16), но безуспешно
  • У нас есть другие клиенты, работающие по сути с той же кодовой базой (другой веткой), созданной с использованием VS2013, и они не испытывают проблемы.
  • Эта проблема может быть замечена как в Win7, так и в Win10

Будут признательны за любые другие улики или потенциальные возможности расследования.

Редактировать: С тех пор мы обнаружили, что только ди Журналы, содержащие элементы управления Text Edit (CEdit), перестают работать, и это, по-видимому, связано с памятью, даже если память приложения относительно невелика.

...