您目前已離線,請等候您的網際網路重新連線

FIX: 根據 CComAutoThreadModule ATL EXE 伺服器可能會掛上註冊

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:202128
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
註冊或取消註冊時,根據 CComAutoThreadModule < > 的 ATL EXE 伺服器可以停止回應。
發生的原因
CComAutoThreadModule<>::Init() WinMain() 中呼叫建立執行緒集區 (預設值 4 的執行緒)。解構函式的全域 CComAutoThreadModule 使得某些這些執行緒終止處理程序終止之前。就會發生這種情況在執行緒集區中張貼到每個執行緒 WM_QUIT 訊息的訊息,並在執行緒控制代碼上呼叫 WaitForSingleObject()。執行緒的排程,讓執行緒集區中的可能不具有呼叫 GetMessage(),因此不會建立訊息佇列。這會導致失敗 PostThreadMessage()。因此,不終止執行緒集區中的執行,並 WaitForSingleObject() 無限地等待終止執行緒。
解決方案
Altcom.h] 檔案中的解構函式 CComAutoThreadModule 函式中 vc98\atl\include 目錄內取代下列程式碼:
   ::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT, 0, 0);				

使用這段程式碼:
   while (::PostThreadMessage(m_pApartments[i].m_dwThreadID, WM_QUIT,      0, 0) == 0) ::Sleep(100);				
狀況說明
Microsoft 已確認這是在本篇文章開頭所列的 Microsoft 產品中有錯誤。

這個問題已經在 Microsoft Visual C++.NET 中獲得修正。
其他相關資訊
  1. 使用 Win32 應用程式] 將 建立 ATL EXE
  2. 在專案中插入 ATL 物件的任何型別。
  3. 在 Stdafx.h,取代 CComModuleCComAutoThreadModule<ccomsimplethreadallocator>.
  4. 建置專案。

    注意: 沒有伺服器可能會在此時擱置,因為自訂建置步驟會註冊伺服器的機會。
  5. 在 [偵錯] 索引標籤類型] 下的 [專案設定] 功能表中"/ RegServer程式引數] 對話方塊中。
  6. 在偵錯工具中執行伺服器。

    注意: 如果它不會停止回應第一次,重複此步驟。由於這是計時相關,問題可能會不重現特定的機器上。
kbDSupport

警告:本文為自動翻譯

內容

文章識別碼:202128 - 最後檢閱時間:01/06/2015 04:07:25 - 修訂: 2.0

Microsoft ActiveX Template Library 3.0

  • kbnosurvey kbarchive kbmt kbbug kbfix kblocalsvr kbthread KB202128 KbMtzh
意見反應