用戶端應用程式在嘗試建立 COM+ 元件時,可能會間歇收到錯誤訊息

本文可協助您解決當用戶端應用程式在建立 COM+ 元件時,可能會間歇收到錯誤訊息的問題。

原始產品版本:   窗戶
原始 KB 編號:   911359

徵狀

當用戶端應用程式嘗試建立 Microsoft COM+ 元件時,用戶端應用程式可能會間歇收到錯誤訊息。

  • Microsoft c + + 應用程式可能會收到下列錯誤訊息:

    E_INVALIDARG:「參數不正確」 (0x80070057/-2147024809)

  • Microsoft Visual Basic 6.0 應用程式可能會收到下列錯誤訊息:

    執行階段錯誤 ' 5 ':「程序呼叫或引數無效」 (0x800a0005/-2146828283)

  • 在 Microsoft .NET Framework 上建立的用戶端應用程式可能會收到下列錯誤訊息:

    ArgumentException: "參數不正確。 在 CreateInstanceImpl (Boolean publicOnly) 。 CreateInstance (Type type,布林非公開) (使用 _HResult = 0x80070057/-2147024809)

COM+ 應用程式在開啟 COM+ 應用程式時,通常會立即運作,而不會發生錯誤。 問題會間歇發生,但是隨著時間的推移會隨著時間不斷增加,直到應用程式在每次啟用要求之後失敗。

原因

發生此問題的原因是,在 CoInitialize 呼叫函數和函數時,執行緒的 (COM) 初始化計數會增加並減少 CoUninitialize 。 當您呼叫函數之後此計數達到零時 CoUninitialize ,COM 將線上程上取消初始化。 當 COM+ 的 STA ThreadPool 執行緒未初始化時,執行緒的公寓 activator 會損毀。 路由傳送至此執行緒的下一個啟用要求會失敗,並出現 E_INVALIDARG 錯誤訊息。 發生此問題的原因是,執行緒的公寓 activator 不再可用。 只有路由傳送至特定未初始化執行緒的啟用要求會失敗。 當更 COM+ 的 ThreadPool 執行緒變得未初始化時,較大的要求百分比會失敗。 當所有的 COM+ ThreadPool 執行緒都未初始化時,所有要求會失敗。 如果重新開機此程式,該問題將會在一段時間後復原。 不過,週期會重複。

解決方案

若要解決此問題,請移除 CoInitialize CoUninitialize 受影響的 COM DLL 中的呼叫和呼叫。 公開 COM 元件的 COM DLL 會透過來自用戶端的 COM 呼叫載入,請勿 CoInitialize CoUninitialize 在用來載入或啟動 DLL 的任何執行緒上呼叫函數或函數。 這些執行緒是由用戶端應用程式、COM runtime 或 COM+ runtime 所擁有。 只有 COM DLL 應該在其他由 COM DLL 明確建立的執行緒上呼叫這些 APIs。 不過,COM Dll 的常見錯誤是用來呼叫 CoInitialize 函數,以及 CoUninitialize 在函數中回應附加事件和拆離事件 DllMain

注意

如果標準 Win32 DLL 計畫使用 COM APIs,則不是透過 COM 載入的標準 Win32 DLL 會正確呼叫這些 APIs。 不過,不應該從函數呼叫這些函數 DllMain

如需有關函數的詳細資訊 CoInitialize ,請參閱 CoInitialize 函數

如需有關該函數的詳細資訊 DllMain ,請參閱 DllMain 進入點

注意

包含此 bug 的一個 Microsoft 元件是 Cdo.dll 元件。 在多執行緒環境中不支援此元件。 相反地,我們建議您使用 Cdosys.dll 元件或 Cdonts.dll 元件。

詳細資訊

若要判斷哪個 COM 元件包含受影響的程式碼,請使用 Microsoft Internet Information Services (IIS) 調試診斷工具 (DebugDiag) 。 若要執行此動作,請依照下列步驟執行:

  1. 下載並安裝 DebugDiag

  2. 在 DebugDiag 中建立一個崩潰規則。 若要執行此動作,請依照下列步驟執行:

    1. 按一下 [ 開始],指向 [ 程式],指向 [ IIS 診斷 (32 位)],指向 [ 調試診斷工具],然後按一下 [ 調試診斷工具 1.0]。
    2. 如果 [ 選取規則類型 ] 對話方塊隨即開啟,請按一下 [ 取消]。
    3. 在 [ 工具 ] 功能表上,按一下 [ 選項及設定]。
    4. 按一下 [ 資料夾及搜尋路徑 ] 索引標籤,然後 srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols 在 [ 分析搜尋路徑 ] 欄位中輸入。
    5. 在 [ 調試的符號搜尋路徑 ] 欄位中,輸入 srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols ,然後按一下 [確定]
    6. 按一下 [ 新增規則]。
    7. 按一下 [ 崩潰],然後按 [下一步]
    8. 按一下 [ 特定 MTS/COM+ 應用程式 (包含高和中隔離網站)],然後按 [下一步]
    9. 按一下適當的 COM+ 應用程式,然後按 [下一步]
    10. 在 [ Advanced Configuration (選用) ] 對話方塊中,按一下 [ 中斷點]。
    11. 在 [ 設定中斷點 ] 對話方塊中,按一下 [ 新增中斷點]。
    12. 在 [設定中斷點] 對話方塊中,輸入 ole32!CoInitializeEx 在 [中斷點運算式] 欄位中,在 [動作類型] 欄位中輸入 1000 ,然後在 [動作類型] 欄位中,保留 記錄堆疊追蹤,然後按一下 [確定]
    13. 在 [ 設定中斷點 ] 對話方塊中,按一下 [ 新增中斷點]。
    14. 在 [設定中斷點] 對話方塊中,輸入 ole32!CoUninitialize 在 [中斷點運算式] 欄位中,于 [動作限制] 欄位中輸入 1000 ,然後按一下 [確定]
    15. 在 [ 設定中斷點 ] 對話方塊中,按一下 [ 儲存] & 關閉]。
    16. 在 [ Advanced Configuration (選用) ] 對話方塊中,按 [下一步]
    17. 在 [ 選取轉儲位置和規則名稱] (選用) ] 對話方塊中,按 [下一步]
    18. 在 [ 規則完成 ] 對話方塊中,按一下 [ 立即啟用規則],然後按一下 [完成]

DebugDiag 會在應用程式執行時監視選取的 COM+ 應用程式。 每次 DebugDiag 遇到選取的中斷點之一時,DebugDiag 會將資料新增至記錄檔。 根據預設,會將記錄檔命名為:
C:\Program Files\IIS Resources\DebugDiag\Logs\dllhost__PID__\<pid>\__Date__\<date> __Time\_\<time> Log.txt

當應用程式中發生錯誤時,請複查適當的記錄檔,以找出受影響的 DLL。 在下列範例中,會 Mybaddll.dll 受影響的 COM 元件。 下列呼叫堆疊是直接來自 COM+ runtime 的預期 API 呼叫範例:

[10/27/2005 10:03:42 AM] Breakpoint at ole32!CoInitializeEx caused by 3500
[10/27/2005 10:03:42 AM] Stack Trace
ChildEBP RetAddr Args to Child
0097ff38 7668c062 00000000 00000002 7c910732 ole32!CoInitializeEx
0097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x6c
0097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa9
0097ffec 00000000 77c3a341 0003e018 00000000 kernel32!BaseThreadStart+0x37

[10/27/2005 10:13:29 AM] Breakpoint at ole32!CoUninitialize caused by 1300
[10/27/2005 10:13:29 AM] Stack Trace
ChildEBP RetAddr Args to Child 
006dff08 766f965b 00000000 000b9838 00037138 ole32!CoUninitialize
006dff70 766f9742 000b9838 00037258 006dffb4 COMSVCS!WORK_QUEUE::WorkerLoop+0x248
006dff80 77c3a3b0 000b9838 00000000 7c9105c8 COMSVCS!WORK_QUEUE::ThreadLoop+0x19
006dffb4 7c80b50b 00037138 00000000 7c9105c8 msvcrt!_endthreadex+0xa9
006dffec 00000000 77c3a341 00037138 00000000 kernel32!BaseThreadStart+0x37

[10/27/2005 10:13:29 AM] Breakpoint at ole32!CoUninitialize caused by 2188
[10/27/2005 10:13:29 AM] Stack Trace
ChildEBP RetAddr Args to Child
0007fd98 0100128e 00092388 00000000 0007fdbc ole32!CoUninitialize
0007ff1c 010015b0 01000000 00000000 00092388 dllhost!WinMain+0xd0
0007ffc0 7c816d4f 00098610 005df0fc 7ffdb000 dllhost!WinMainCRTStartup+0x174
0007fff0 00000000 0100143c 00000000 78746341 kernel32!BaseProcessStart+0x23

下列呼叫堆疊是自訂 DLL 中非預期 API 呼叫的範例:

[10/27/2005 10:03:49 AM] Breakpoint at ole32!CoInitializeEx caused by 3500
[10/27/2005 10:03:42 AM] Stack Trace
ChildEBP RetAddr Args to Child
0097e684 1001349c 00000000 00000001 0097e7cc ole32!CoInitialize
0097e76c 100293ca 10000000 00000001 00000000 MyBadDLL!DllMain+0x4c
0097e7b8 7c9011a7 10000000 00000001 00000000 MyBadDLL!_DllMainCRTStartup+0xca
0097e7d8 7c91cbab 10011712 10000000 00000001 ntdll!LdrpCallInitRoutine+0x14
0097e8e0 7c916178 00000000 c0150008 00000000 ntdll!LdrpRunInitializeRoutines+0x344
0097eb8c 7c9162da 00000000 000c6a30 0097ee80 ntdll!LdrpLoadDll+0x3e5
0097ee34 7c801bb9 000c6a30 0097ee80 0097ee60 ntdll!LdrLoadDll+0x230
0097ee9c 7752e1b1 0097ef18 00000000 00000008 kernel32!LoadLibraryExW+0x18e
0097eec0 7752e0cd 0097ef18 0097eee4 0097eee8 ole32!CClassCache::CDllPathEntry::LoadDll+0x6c
0097eef0 7752d550 0097ef18 0097f1f4 0097ef10 ole32!CClassCache::CDllPathEntry::Create_rl+0x37
0097f13c 7752d473 00000001 0097f1f4 0097f16c ole32!CClassCache::CClassEntry::CreateDllClassEntry_rl+0xd6
0097f184 7752d3d1 00000001 000ba820 0097f1ac ole32!CClassCache::GetClassObjectActivator+0x195
0097f1b0 7752cf3b 0097f1f4 00000000 000d82c4 ole32!CClassCache::GetClassObject+0x23
0097f22c 7752cddf 77607150 00000000 000d82c4 ole32!CServerContextActivator::CreateInstance+0x106
0097f26c 76672d76 000d82c4 00000000 0097f33c ole32!ActivationPropertiesIn::DelegateCreateInstance+0xf7
0097f2e0 7752cddf 000cba80 00000000 000d82c4 COMSVCS!CObjectActivator::CreateInstance+0x21c
0097f320 7759699a 000d82c4 00000000 0097f33c ole32!ActivationPropertiesIn::DelegateCreateInstance+0xf7
0097f340 775877e1 000cf170 000b492c 00000000 ole32!DoServerContextCCI+0x1d
0097f38c 775880cf 00000000 000b492c 7759697d ole32!EnterForCallback+0xc2
0097f4ec 77563258 0097f3c4 7759697d 000cf170 ole32!SwitchForCallback+0x1a3
0097f518 7751929f 000b492c 7759697d 000cf170 ole32!PerformCallback+0x54
0097f5b0 7758a738 00099940 7759697d 000cf170 ole32!CObjectContext::InternalContextCallback+0x155
0097f5d0 77596ba1 00099940 7759697d 000cf170 ole32!CObjectContext::DoCallback+0x1c
0097f5fc 77567439 77607154 000d82c4 000d0ba0 ole32!CApartmentActivator::ContextCallHelper+0x4e
0097f658 77e79dc9 77607154 00000000 000d82c4 ole32!CApartmentActivator::CreateInstance+0x110
0097f67c 77ef321a 7752cfbc 0097f690 00000004 RPCRT4!Invoke+0x30
0097fa88 77ef3bf3 000d8ea0 000cfc04 000cecb4 RPCRT4!NdrStubCall2+0x297
0097fae0 77600c31 000d8ea0 000cecb4 000cfc04 RPCRT4!CStdStubBuffer_Invoke+0xc6
0097fb20 77600bdb 000cecb4 000b689c 00000000 ole32!SyncStubInvoke+0x33
0097fb68 7750f237 000cecb4 000d5de8 000d8ea0 ole32!StubInvoke+0xa7
0097fc40 7750f15c 000cfc04 00000000 000d8ea0 ole32!CCtxComChnl::ContextInvoke+0xe3
0097fc5c 7750fc79 000cecb4 00000001 000d8ea0 ole32!MTAInvoke+0x1a
0097fc88 77600e3b 000cecb4 00000001 000d8ea0 ole32!STAInvoke+0x4a
0097fcbc 776009bc 000cec60 000cfc04 000d8ea0 ole32!AppInvoke+0x7e
0097fd90 77600df2 000cec60 000b1b10 00000000 ole32!ComInvokeWithLockAndIPID+0x2e0
0097fdbc 7750fcb3 000cec60 00000400 000d1d88 ole32!ComInvoke+0x60
0097fdd0 7750fae9 000cec60 0097fe50 7750fa56 ole32!ThreadDispatch+0x23
0097fde8 77d48734 002f07c8 000c7d08 0000babe ole32!ThreadWndProc+0xfe
0097fe14 77d48816 7750fa56 002f07c8 00000400 USER32!InternalCallWinProc+0x28
0097fe7c 77d489cd 00000000 7750fa56 002f07c8 USER32!UserCallWinProcCheckWow+0x150
0097fedc 77d48a10 000de3fc 00000000 0097ff08 USER32!DispatchMessageWorker+0x306
0097feec 7668b57c 000de3fc 000de3f8 000de370 USER32!DispatchMessageW+0xf
0097ff08 7668b42d 000de390 000de370 000de3ec COMSVCS!CSTAQueueLessMessageWork::DoWork+0x4e
0097ff20 7668bea5 000de3f8 7668c2d0 000de370 COMSVCS!CSTAThread::DoWork+0x18
0097ff40 7668c197 7c910732 0003c9a8 0003e018 COMSVCS!CSTAThread::ProcessQueueWork+0x47
0097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x1a1
0097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa9
0097ffec 00000000 77c3a341 0003e018 00000000 kernel32!BaseThreadStart+0x37

[10/27/2005 10:08:42 AM] Breakpoint at ole32!CoUninitialize caused by 628
[10/27/2005 10:08:42 AM] Stack Trace
ChildEBP RetAddr Args to Child
0097f9f4 100134e5 0097fb7c 0097fb38 10011712 ole32!CoUninitialize
0097fad8 100293ca 10000000 00000000 00000000 MyBadDLL!DllMain+0x95
0097fb24 7c9011a7 10000000 00000000 00000000 MyBadDLL!_DllMainCRTStartup+0xca
0097fb44 7c91e6f4 10011712 10000000 00000000 ntdll!LdrpCallInitRoutine+0x14
0097fc3c 7c80aa7f 10000000 0097fc90 0097fdb0 ntdll!LdrUnloadDll+0x41c
0097fc50 77513442 10000000 0097fdd0 77513456 kernel32!FreeLibrary+0x3f
0097fc5c 77513456 0097fc9c 776067e0 00000000 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish+0x2f
0097fc70 775135fe 774e1ab0 00000000 00000000 ole32!CClassCache::CFinishComposite::Finish+0x1d
0097fdd0 77513578 ffffffff 000c7d08 0097fe1c ole32!CClassCache::FreeUnused+0x19d
0097fde0 775133a2 ffffffff 00000000 7668b359 ole32!CoFreeUnusedLibrariesEx+0x36
0097fdec 7668b359 77d48734 00000000 00000113 ole32!CoFreeUnusedLibraries+0x9
0097fdf0 77d48734 00000000 00000113 0000705b COMSVCS!STAFreeLibTimerProc+0x6
0097fe1c 77d49857 7668b353 00000000 00000113 USER32!InternalCallWinProc+0x28
0097fe84 77d49791 00000000 7668b353 00000000 USER32!UserCallWinProc+0xf3
0097fedc 77d48a10 000de3fc 00000000 0097ff08 USER32!DispatchMessageWorker+0x10e
0097feec 7668b57c 000de3fc 000de3f8 000de370 USER32!DispatchMessageW+0xf
0097ff08 7668b42d 000de390 000de370 000de3ec COMSVCS!CSTAQueueLessMessageWork::DoWork+0x4e
0097ff20 7668bea5 000de3f8 7668c2d0 000de370 COMSVCS!CSTAThread::DoWork+0x18
0097ff40 7668c197 7c910732 0003c9a8 0003e018 COMSVCS!CSTAThread::ProcessQueueWork+0x47
0097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x1a1
0097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa9
0097ffec 00000000 77c3a341 0003e018 00000000 kernel32!BaseThreadStart+0x37