FIX: ATL EXE Server Based on CComAutoThreadModule May Hang on Registration (202128)
The information in this article applies to:
- The Microsoft Active Template Library (ATL) 3.0, when used with:
- Microsoft Visual C++, 32-bit Enterprise Edition 6.0
- Microsoft Visual C++, 32-bit Professional Edition 6.0
- Microsoft Visual C++, 32-bit Learning Edition 6.0
This article was previously published under Q202128 SYMPTOMS
An ATL EXE server based on CComAutoThreadModule<> can hang when being registered or unregistered.
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.
RESOLUTION
In the Altcom.h file, inside the vc98\atl\include directory of destructor in the CComAutoThreadModule function replace the following code:
::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);
with this code:
while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,
0, 0) == 0) ::Sleep(100);
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.
Modification Type: | Major | Last Reviewed: | 12/11/2003 |
---|
Keywords: | kbBug kbfix kbLocalSvr kbThread KB202128 |
---|
|