FIX: EXE ATL Server in base al CComAutoThreadModule potrebbe bloccarsi sulla registrazione

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

202128
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Un server di EXE ATL in base a CComAutoThreadModule <> può bloccarsi quando viene registrato o non registrato.
Cause
CComAutoThreadModule<>::Init() chiamato in WinMain() crea un pool di thread (tramite thread predefinito 4). Il distruttore di CComAutoThreadModule globale rende alcuni di che questi thread terminare prima che il processo viene terminato. Ciò si verifica inserimento di un messaggio WM_QUIT a tutti i thread nel pool di thread e chiamando WaitForSingleObject() sull'handle del thread. I thread vengono pianificati tale che il thread nel pool di non potrebbe essere stato chiamato GetMessage() e, in modo che la coda di messaggi non venga creata. In questo modo il PostThreadMessage() esito negativo. Di conseguenza, non terminato il thread nel pool di e WaitForSingleObject() attende all'infinito i thread da terminare.
Risoluzione
Nel file Altcom.h, all'interno della directory vc98\atl\include del distruttore nella funzione CComAutoThreadModule sostituire il codice riportato di seguito:
   ::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);				

con questo codice:
   while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,      0, 0) == 0) ::Sleep(100);				
Status
Microsoft ha confermato che si tratta di un problema che riguarda solo i prodotti elencati all'inizio di questo articolo.

Questo problema è stato corretto in Microsoft Visual c ++. NET.
Informazioni
  1. Utilizzare AppWizard per creare un EXE ATL .
  2. Consente di inserire qualsiasi tipo di oggetto ATL nel progetto.
  3. In stdafx.h, sostituire CComModule con CComAutoThreadModule<ccomsimplethreadallocator>.
  4. Generare il progetto.

    Nota : è probabile che il server potrebbe bloccarsi a questo punto dopo il passaggio di generazione personalizzata registra il server.
  5. Nel menu Impostazioni progetto sotto il tipo di scheda debug " / RegServer " nella finestra di dialogo Argomenti di programma .
  6. Eseguire il server nel debugger.

    Nota : se si chiude la prima volta, ripetere questo passaggio. Poiché si tratta temporizzazione correlati, il problema non può riprodurre su alcuni computer.
kbDSupport

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 202128 - Ultima revisione: 01/06/2015 04:07:16 - Revisione: 2.0

  • Microsoft ActiveX Template Library 3.0
  • kbnosurvey kbarchive kbmt kbbug kbfix kblocalsvr kbthread KB202128 KbMtit
Feedback