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

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.

202128
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
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.
kbDSupport

Warning: This article has been translated automatically

Propiedades

Id. de artículo: 202128 - Última revisión: 01/06/2015 04:07:13 - Revisión: 2.0

  • Microsoft ActiveX Template Library 3.0
  • kbnosurvey kbarchive kbmt kbbug kbfix kblocalsvr kbthread KB202128 KbMtes
Comentarios