Microsoft KB Archive/202128

= FIX: ATL EXE Server Based on CComAutoThreadModule May Hang on Registration =

Article ID: 202128

Article Last Modified on 12/11/2003

-

APPLIES TO

 Microsoft ActiveX Template Library 3.0, when used with:  Microsoft Visual C++ 6.0 Enterprise Edition

 Microsoft Visual C++ 6.0 Professional Edition

 Microsoft Visual C++ 6.0 Standard Edition 

-

<div class="notice_section">

This article was previously published under Q202128

<div class="symptoms_section">

SYMPTOMS
An ATL EXE server based on CComAutoThreadModule<> can hang when being registered or unregistered.

<div class="cause_section">

CAUSE
CComAutoThreadModule<>::Init called in WinMain creates a thread pool (by default 4 threads). The destructor of global CComAutoThreadModule makes certain these threads terminate before the process terminates. This happens by posting a WM_QUIT message to each of the threads in the thread pool and calling WaitForSingleObject on the thread handle. The threads are scheduled such that the threads in the pool may not have called GetMessage and so the message queue is not created. This causes the PostThreadMessage to fail. Hence, the threads in the pool do not terminate and WaitForSingleObject waits infinitely for the threads to terminate.

<div class="resolution_section">

RESOLUTION
In the Altcom.h file, inside the vc98\atl\include directory of destructor in the CComAutoThreadModule function replace the following code:



with this code:

while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0) == 0) ::Sleep(100);

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

This problem was corrected in Microsoft Visual C++ .NET.

<div class="moreinformation_section">

MORE INFORMATION

 * 1) Use Appwizard to create an ATL EXE.
 * 2) Insert any type of ATL object in the project.
 * 3) In Stdafx.h, replace CComModule with CComAutoThreadModule<CComSimpleThreadAllocator>.
 * 4) Build the project.

NOTE: There is a chance that the server may hang at this point since the custom build step registers the server.
 * 1) In the Project Settings menu under the Debug tab type "/RegServer" in the Program Arguments dialog box.
 * 2) Run the server in the debugger.

NOTE: If it does not hang the first time, repeat this step. Since this is timing related, the problem may not reproduce on certain machines.

Additional query words: kbDSupport

Keywords: kbbug kbfix kbthread kblocalsvr KB202128

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.