Recibir una aserción en Wincore.cpp cuando utiliza una aplicación de MFC de Visual C++ 4.x generada desde un servicio de Windows NT o como un servicio de Windows NT

Seleccione idioma Seleccione idioma
Id. de artículo: 164166 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza una aplicación de MFC de Visual C++ 4.x generada desde un servicio de Windows NT o como un servicio de Windows NT, puede producirse una aserción en Wincore.cpp. Específicamente, se produce en la línea siguiente en _AfxActivationWndProc():
  LRESULT CALLBACK
 _AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
 {

    WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, szAfxOldWndProc);
    ASSERT(oldWndProc != NULL);  // <----- assert occurs here
    .
    .
    .
 }
				
la aserción se produce en línea 385 con las versiones de Visual C++ 4.2 y 4.2b en línea 384 con Visual C++ versión 4.1, línea 392 con Visual C++ versión 5.0 y en línea 389 con Visual C++ 6.0.

Causa

Las subclases MFC no MFC creado todas las ventanas para tratar problemas específicos de la activación. Al crear subclases de una ventana de MFC creado, el procedimiento de ventana anterior se almacena en las propiedades de la ventana. Cerrar la sesión de una sesión de Windows hace que los subcomponentes que utiliza para identificar las propiedades que se destruya y la propiedad no puede recuperarse. Esto hace que la aserción de producirse.

MFC no fue diseñado para servicios de Windows NT. Como resultado, si una aplicación MFC se genera desde un servicio de Windows NT, minimizado, y a continuación, un usuario inicia - desactivado, a continuación, se producirá la aserción.

También tenga en cuenta que hay otros problemas a considerar cuando genere una aplicación MFC desde un servicio o como un servicio. Cierra el controlador de mensaje OnEndSession() para la ventana de marco principal fuera el objeto de CDocument. Por lo que debe controlarse el mensaje WM_ENDSESSION para evitar que esto ocurra.

Solución

Puede realizar una de las siguientes acciones:

  • Unsubclass todas las ventanas no MFC en algún momento antes de cerrar la sesión o durante el cierre de sesión como en el controlador WM_ENDSESSION.
  • Modifique el código de MFC y volver a generar las bibliotecas MFC. En este caso, puede modificar el código MFC para evitar que subclases de las ventanas de MFC o modificar el código para que puede almacenar el procedimiento de ventana anterior en una lista en lugar de las propiedades de la ventana. Como se destruye cada ventana (WM_NCDESTROY es recibido), buscar el identificador de ventana en la lista y unsubclass lo que realiza MFC en la función _AfxActivationWndProc().
  • Separar la parte GUI de la aplicación desde la parte del servicio. En otras palabras, debe tener un inicio de cliente gráfico cada vez que el usuario inicia sesión. Tiene a continuación, el cliente de GUI hablar con el servicio a través de alguna forma de comunicación entre procesos, como canalizaciones con nombre o sockets. El servicio debe mantener los datos y la GUI se inicia cada vez en cuando inicie sesión.
MFC las subclases no MFC ventanas generalmente tratar problemas de activación de ventana crípticos. Por ejemplo, garantiza activación correcta de ventanas de nivel superior al realizar la activación de OLE en contexto. También garantiza que el último emergente activo se activa cuando un usuario hace clic en una ventana deshabilitada que forma parte de la aplicación. Normalmente, si tiene una ventana principal que posee un cuadro de diálogo modal y algunos otro ventana emergente como una barra de herramientas flotante, y cambiar activación a otra aplicación y haga clic en la barra de herramientas fue deshabilitada por el cuadro de diálogo modal, Windows emite un pitido y no activa la aplicación. MFC, se garantiza que el cuadro de diálogo modal es traído hasta la parte superior al hacer clic en la barra de herramientas. Tenga en cuenta que MFC controla todos estos problemas de activación para windows creada por MFC y Windows de MFC creado. El procedimiento de ventana anterior se almacena como una propiedad asociada con la ventana sólo para windows no MFC. Si se unsubclass las ventanas de MFC (como la primera técnica sugiere de anteriormente), obtendrá aún estas características de activación para todas las ventanas que se crearon como objetos derivados de MFC CWnd.

Unsubclassing el que no sean de MFC Windows

La primera técnica enumerada anteriormente puede ser una solución sencilla para los programadores que ya ha escrito una aplicación y no desea volver a definir su diseño, volver a generar las bibliotecas MFC o no necesita controlar la activación, emite identificadores MFC.

Puede unsubclass no basados en MFC Windows en el controlador WM_ENDSESSION de la ventana de marco principal. El código de ejemplo siguiente muestra cómo enumerar todas las ventanas de su proceso y unsubclass de ellos: Visual C++ 4.x y Visual C++ 5.0:
    static const TCHAR szAfxOldWndProc[] = _T("AfxOldWndProc");  
				
para Visual C++ 6.0:
    static const TCHAR szAfxOldWndProc[] = _T("AfxOldWndProc423");  // Visual C++ 6.0
				
y agregar las funciones:
    BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam)
 {
    //check for property and unsubclass if necessary
    WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, szAfxOldWndProc);
    if (oldWndProc!=NULL)
    {
       SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)oldWndProc);
       RemoveProp(hWnd, szAfxOldWndProc);
    }

    return TRUE;

 }

 void CMainFrame::OnEndSession(BOOL bEnding)
 {
    // unsubclass the non-MFC windows which MFC has subclassed
    DWORD dwProcessId;

    DWORD dwThreadId= GetWindowThreadProcessId(m_hWnd,&dwProcessId);
    EnumThreadWindows(dwThreadId, EnumProc,(LPARAM) dwThreadId);

 }
				

Propiedades

Id. de artículo: 164166 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 4.3
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual Studio 2005 Professional Edition
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Team System Architect Edition
  • Microsoft Visual Studio 2005 Team System Developer Edition
  • Microsoft Visual Studio .NET 2003 Professional
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
Palabras clave: 
kbnosurvey kbarchive kbmt kberrmsg kbtshoot kbcode kbdocview kbprb kbservice kbuidesign KB164166 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 164166

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com