2014-01-26 8 views
0

Из любопытства:Если данный вызов RegisterClassEx() успешно выполняется один раз, могу ли я считать, что он всегда будет?

В моей wWinMain() точки входа я заполнение WNDCLASSEX структуру, которая впоследствии я приходящие к RegisterClassEx(). Это первое, что делается в WinMain, и это выглядит следующим образом:

WNDCLASSEX windowConfig = {0}; 

windowConfig.cbSize = sizeof(WNDCLASSEX); 
windowConfig.style = CS_HREDRAW | CS_VREDRAW; 
windowConfig.lpfnWndProc = WndProc; 
windowConfig.hInstance = hInstance; 
windowConfig.hCursor = LoadCursor(NULL, IDC_ARROW); 
windowConfig.lpszClassName = L"Title"; 

if (!RegisterClassEx(&windowConfig)) 
{ 
    MessageBox(NULL, "RegisterClassEx failed for no apparent reason", NULL, NULL); 
    return FALSE; 
} 

Если эта конфигурация работает нормально один раз, будет ли он когда-нибудь не? Могло ли одно - учитывая, что параметры не изменены - на практике практически предполагается, что регистрация класса всегда будет успешной и пропустить проверку? Другими словами, только

RegisterClassEx(&windowConfig); 

.. и двигаться дальше?

Что может не получиться?

+2

Нет, вы не можете этого принять. Жизнь не улучшилась с помощью антивирусной защиты, исправляющей операционную систему и бесконечного множества утилит, которые, похоже, облегчают вам жизнь, но фактически внедряют DLL в каждый процесс, чтобы выполнить свою работу. Независимо от того, хотите ли вы генерировать значимую диагностику, когда такая перевязка искажает состояние процесса настолько плохо, что этот код не работает, зависит от вас. Вы можете рассчитывать на то, что большинство пользователей сначала вызовут * вы *. Если вам не на что смотреть, тогда вам, конечно, нелегко оттолкнуть его к тому, кто действительно ответственен за это. –

+0

Интересно. Можем ли мы узнать более конкретно, что сделало бы такие инъекции DLL причиной отказа нашей регистрации классов? – d7samurai

+0

@ d7samurai: Из личного опыта люди, которые придумывают инъекцию DLL в качестве решения, как правило, не являются самыми яркими разработчиками. Я разобрал одну такую ​​DLL, содержащую неиспользуемые биты несвязанного образца кода Microsoft, в комплекте с точками входа! – MSalters

ответ

3

Он потребляет системные ресурсы, так что в теории, в отработанной системе, он может потерпеть неудачу (в этом случае LoadCursor вероятно, это не первый)

+1

Но в таком сценарии не будет _anything_ и все в противном случае (т. Е. Не будет проверять результат вызова 'RegisterClassEx')? – d7samurai

+0

Можно бесконечно спорить. Что произойдет, если какой-либо другой разработчик изменил инициализацию 'windowConfig'? Вы можете сохранить его/ее ценное время, отлаживая ошибку. – amsh

+0

В своем вопросе я заявил, что параметры не изменены. – d7samurai

1

RegisterClass (Ex) может не выполняется, если класс уже зарегестрирована. И т. Д. В некоторой DLL, загруженной вашим процессом, используется класс L «Название». Таким образом, ваше окно не будет создано. Всегда (!) Правильно использовать проверку ошибок.

ОБНОВЛЕНИЕ: Я забыл упомянуть, что RegisterClass (Ex) может завершиться неудачно, если глобальная таблица атомов просочилась и/или полностью заполнена.

+0

Итак, 'lpszClassName' - это _only_ вещь, которая идентифицирует класс окна во всей операционной системе? Как можно запустить любую программу с несколькими экземплярами? – d7samurai

+0

Моя ошибка, я переписываю ответ. Спасибо за ответ. – Xearinox

+0

Согласно [этой статье] (http://blogs.msdn.com/b/oldnewthing/archive/2005/04/18/409205.aspx), имя класса не имеет значения даже в пределах одного процесса, так как окна идентифицируются своими дескрипторами экземпляров. Цитата: «Вот почему все в порядке, если несколько DLL регистрируют класс под названием« MyClass », дескриптор экземпляра используется, чтобы разделить их». – d7samurai

Смежные вопросы