Если ваш класс окон определен в DLL
Возможно, вам следует позвонить на RegisterClass()
в PROCESS_ATTACH-части DllMain и позвонить на UnregisterClass()
в PROCESS_DETACH-части DllMain
Если ваш класс окон определен в исполняемом файле
Возможно, вам следует позвонить на RegisterClass()
в основном, до цикла сообщений, и позвонить в UnregisterClass()
в основном, после цикла сообщений.
Регистрация в конструкторе объектов была бы ошибкой
Потому что вы бы рефлекторно очистили его в деструкторе. Если одно из ваших окон будет уничтожено, будет вызван деструктор и ... Если у вас есть другие окна, плавающие вокруг ...
А для использования глобальных данных для подсчета количества активных регистраций потребуется правильная синхронизация, чтобы убедиться, что ваш код ориентирован на многопоточность, если не поточнобезопасен.
Почему в основном / DllMain?
Потому что вы регистрируете какой-то глобальный объект (по крайней мере, для вашего процесса). Поэтому имеет смысл инициализировать его «глобальным способом», то есть в основном или в DllMain.
Почему это не так зло?
Потому что Windows не выйдет из строя только потому, что вы зарегистрировали ее более одного раза.
Чистый код использовал бы GetClassInfo()
, чтобы спросить, был ли класс уже зарегистрирован.
Но, опять же, Windows не будет зависать (по крайней мере, по этой причине).
Вы даже можете избежать отмены регистрации класса окна, так как Windows удалит их после завершения процесса. Я видел противоречивую информацию в блогах MSDN на эту тему (два года назад ... не просите меня снова найти эту информацию).
Почему это все равно зло?
Моя личная точка зрения заключается в том, что вы должны аккуратно обращаться со своими ресурсами, то есть выделять их один раз, а освобождать - один раз. То, что Win32 удалит утечку памяти, не должно помешать вам освободить динамически выделенную память. То же самое касается оконных классов.