REVISIÓN: EXE ATL Server según CComAutoThreadModule puede bloquearse en el registro

Seleccione idioma Seleccione idioma
Id. de artículo: 202128 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Un servidor de ATL EXE en función de CComAutoThreadModule <> puede bloquearse cuando se registra o no registrados.

Causa

CComAutoThreadModule<>::Init() denominado en WinMain() crea un grupo de subprocesos (de forma predeterminada 4 subprocesos). El destructor de CComAutoThreadModule global hace que algunos de que estos subprocesos terminar antes de que el proceso termina. Esto sucede envíe un mensaje WM_QUIT a cada uno de los subprocesos en el grupo de subprocesos y llamar a WaitForSingleObject() en el identificador de subproceso. Los subprocesos se programan como que los subprocesos en el grupo pueden no han llamado a GetMessage() y no se crea la cola de mensajes. Esto hace que el PostThreadMessage() un error. Por lo tanto, los subprocesos en el grupo no terminará y WaitForSingleObject() espera indefinidamente para que los subprocesos terminar.

Solución

En el archivo Altcom.h, dentro del directorio vc98\atl\include de destructor de la función de CComAutoThreadModule, reemplace el código siguiente:
   ::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);
				

con este código:
   while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,
      0, 0) == 0) ::Sleep(100);
				

Estado

Microsoft ha confirmado que se trata de un error de los productos Microsoft enumerados al principio de este artículo.

Este problema se corrigió en Microsoft Visual C++. NET.

Más información

  1. Utilice el Asistente para aplicaciones para crear un EXE ATL .
  2. Inserte cualquier tipo de objeto ATL en el proyecto.
  3. En stdafx.h, reemplazar CComModule CComAutoThreadModule<ccomsimplethreadallocator>.
  4. Genere el proyecto.

    Nota : hay una posibilidad de que el servidor puede bloquearse en este momento ya que el paso de generación personalizada registra el servidor.
  5. En el menú Configuración del proyecto en el tipo de ficha depuración " / RegServer " en el cuadro de diálogo Argumentos de programa .
  6. Ejecute el servidor en el depurador.

    Nota : si no se bloquea la primera vez, repita este paso. Puesto que esto es relacionados con el tiempo, el problema no puede reproducir en determinados equipos.

Propiedades

Id. de artículo: 202128 - Última revisión: jueves, 11 de diciembre de 2003 - Versión: 2.0
La información de este artículo se refiere a:
  • Microsoft ActiveX Template Library 3.0 sobre las siguientes plataformas
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palabras clave: 
kbmt kbbug kbfix kblocalsvr kbthread KB202128 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): 202128

Enviar comentarios

 

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