2011-04-26 17 views
5

Recibo una clase que ya existe error de la llamada a RegisterClassEx en el siguiente código. Este código se encuentra en un constructor de la clase:Volver a registrar clase de ventana definida por el usuario - C++

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); 
} 

Esta primera vez que este código se ejecuta, funciona sin ningún problema. Cuando el destructor de la clase que se llama anula el registro de la clase:

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

Todo esto funciona bien la primera vez a través. Las llamadas posteriores al constructor dan como resultado RegisterClassEx que falla con ERROR_CLASS_ALREADY_EXISTS. ¿Qué estoy haciendo mal?

+0

¿Está seguro de que se llama al destructor de la primera instancia antes de crear la segunda instancia? –

+0

@unaperson: Sí. Estoy ejecutando esto desde una aplicación de prueba, a menos que haya un error fatal, que se registraría, al destructor solo se le llama cuando manualmente le pido que lo llame. –

+1

¿Ha comprobado el valor de retorno de 'UnregisterClass'? – Jon

Respuesta

8

UnregisterClass() fallará (no eliminará la clase) si hay ventanas de esa clase en el sistema. Por lo tanto, necesitará ::DestroyWindow() para todas las ventanas que se crearon con la clase.

4

No eliminaría el registro de una clase cuando más tarde fuera necesaria. Me probar ERROR_CLASS_ALREADY_EXISTS así:

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

que tienen el mismo problema, estoy seguro de que destruyo la única ventana que se ha creado usando clase especificada y luego llamar UnregisterClass y devolverlo VERDADERO (1), pero parece que no elimina la clase del sistema y obtengo ERROR_ALREADY_EXIST de la próxima llamada a RegisterClassEx

Cuestiones relacionadas