Когда мое приложение стартует, RegisterClassEx
иногда возвращает 0
, и приложение приходится аварийно завершать. Это происходит не по тому ли что иногда класс окна не уничтожается, а остается в памяти менеджера окон? Нужно ли мне вызывать UnregisterClass
вручную после получения сообщения WM_DESTROY
и вызова PostQuitMessage
?
Еще приведу цитату с одного из сайтов по winapi
:
Регистрация всех классов окон, которые зарегистрировало приложение, должна быть отменена при его завершении.
От чего появляется мнение что программист обязан отменять регистрацию классов окон независимо от обстоятельств.
Функцию UnregisterClass не нужно вызывать при завершении приложения: при этом все классы разрегистрируются автоматически. Ее нужно вызывать в случае, если класс создается из DLL, перед выгрузкой DLL из памяти. Если такой класс не разрегистрировать, память под него не будет освобождена, а также попытки обращения к его оконной процедуре положат всю программу с Access Violation.
Что касается ошибки при регистрации класса, популярная причина - исчерпание системной таблицы атомов, которая используется для хранения зарегистрированных оконных классов, форматов буфера обмена и нестандартных сообщений. Если какое-то приложение создает слишком много атомов, она может исчерпаться и дальше ни одна программа в системе не сможет зарегистрировать класс (пока не прибить "жрущее" приложение или оно само не упадет). Возможно, в вашем коде или в какой-то используемой библиотеке баг, который приводит к этому.
Ссылки:
About Windows Classes
Why RegisterClass fails with ERROR_NOT_ENOUGH_MEMORY?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно динамически с помощью переменных и регулярного выражения поменять последнее значение в строкеВ первом случае работает во втором нет
Нужно чтобы в saidbar'е отображать файлы HTML,CSS,JS,PHP, а в контенте содержимое этого файлаКак это сделать?