Перерегистрация пользовательского класса окна - C ++ - PullRequest
5 голосов
/ 26 апреля 2011

Я получаю класс, уже существует ошибка при вызове RegisterClassEx в следующем коде.Этот код находится в конструкторе класса:

this->m_wcx.cbSize = sizeof(WNDCLASSEX);  // size of structure
this->m_wcx.style = CS_HREDRAW | CS_VREDRAW; // initially minimized
this->m_wcx.lpfnWndProc = &WndProc;       // points to window procedure
this->m_wcx.cbClsExtra = 0;               // no extra class memory
this->m_wcx.cbWndExtra = 0;               // no extra window memory
this->m_wcx.hInstance = m_hInstance;      // handle to instance
this->m_wcx.hIcon = ::LoadIcon( NULL, IDI_APPLICATION ); // default app icon
this->m_wcx.hCursor = ::LoadCursor( NULL, IDC_ARROW ); // standard arrow cursor
this->m_wcx.hbrBackground = NULL;         // no background to paint
this->m_wcx.lpszMenuName = NULL;          // no menu resource
this->m_wcx.lpszClassName = s_pwcWindowClass; // name of window class
this->m_wcx.hIconSm = NULL;               // search system resources for sm icon

// Register window class.
if ( (this->m_atom = ::RegisterClassEx( &m_wcx )) == 0 )
{
    dwError = ::GetLastError();
    TRACE(_T("Failed to register window class.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), dwError, _T(__FILE__), __LINE__);
    THROW(dwError);
}

При первом запуске этот код работает без проблем.Когда вызывается деструктор класса, он отменяет регистрацию класса:

::UnregisterClass( s_pwcWindowClass, this->m_hInstance );

Все это работает отлично с первого раза.Последующие вызовы конструктора приводят к сбою RegisterClassEx с ERROR_CLASS_ALREADY_EXISTS.Что я делаю не так?

Ответы [ 3 ]

8 голосов
/ 26 апреля 2011

UnregisterClass() не удастся (не удалит класс), если в системе есть окна этого класса.Так что вам нужно будет ::DestroyWindow() для всех окон, которые были созданы с помощью класса.

4 голосов
/ 02 октября 2011

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

ATOM reg=RegisterClassEx(&m_wcx);
DWORD err=GetLastError();
if(!reg && !(err==ERROR_CLASS_ALREADY_EXISTS)){
    //throw only if not successful and not already registered
}
0 голосов
/ 15 августа 2012

У меня та же проблема, я уверен, что я уничтожаю единственное окно, созданное с использованием указанного класса, а затем вызываю UnregisterClass, и он возвращает TRUE (1), но кажется, что он не удаляет класс из системы, и я получить ERROR_ALREADY_EXIST от следующего вызова RegisterClassEx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...