クライアント アプリケーションが COM+ コンポーネントを作成しようとすると、断続的にエラー メッセージが表示される場合があります

この記事では、COM+ コンポーネントを作成するときに、クライアント アプリケーションが断続的にエラー メッセージを受信する可能性がある問題を解決するのに役立ちます。

元の製品バージョン: Windows
元の KB 番号: 911359

現象

クライアント アプリケーションが Microsoft COM+ コンポーネントを作成しようとすると、クライアント アプリケーションで断続的にエラー メッセージが表示されることがあります。

  • Microsoft C++ アプリケーションでは、次のエラー メッセージが表示される場合があります。

    E_INVALIDARG: "パラメーターが正しくありません" (0x80070057/-2147024809)

  • Microsoft Visual Basic 6.0 アプリケーションでは、次のエラー メッセージが表示される場合があります。

    実行時エラー '5': "プロシージャ呼び出しまたは引数が無効です" (0x800a0005/-2146828283)

  • Microsoft .NET Frameworkに基づいて構築されたクライアント アプリケーションでは、次のエラー メッセージが表示される場合があります。

    System.ArgumentException: System.Activator.CreateInstance(Type type, Boolean nonPublic) の System.Runtime.Type.CreateInstanceImpl(Boolean publicOnly) の "パラメーターが正しくありません"(_HResult = 0x80070057/-2147024809)

通常、COM+ アプリケーションは、COM+ アプリケーションを開いた直後にエラーなしで機能します。 この問題は断続的に発生しますが、すべてのアクティブ化要求でアプリケーションが最終的に失敗するまで、時間の経過と共に頻度が増加します。

原因

この問題は、スレッドのコンポーネント オブジェクト モデル (COM) 初期化数がインクリメントされ、関数と関数が呼び出されたときに CoInitialize 減らされるために CoUninitialize 発生します。 関数を呼び出した後にこのカウントが CoUninitialize 0 に達すると、COM はスレッドで初期化されません。 COM+ STA ThreadPool スレッドが初期化されていない場合、スレッドのアパートメント アクティベーターは破棄されます。 このスレッドにルーティングされる次のアクティブ化要求は、 E_INVALIDARG エラー メッセージで失敗します。 この問題は、スレッド アパートメント アクティベーターが使用できなくなったために発生します。 特定の初期化されていないスレッドにルーティングされるアクティブ化要求のみが失敗します。 COM+ ThreadPool スレッドが初期化されなくなるにつれて、要求の割合が大きくなると失敗します。 すべての COM+ ThreadPool スレッドが初期化されなくなると、すべての要求は失敗します。 プロセスが再起動されると、問題はしばらく回復します。 ただし、サイクルは繰り返されます。

解決方法

この問題を解決するには、影響を CoInitialize 受ける COM DLL から呼び出しと CoUninitialize 呼び出しを削除します。 COM コンポーネントを公開し、クライアントからの COM 呼び出しを通じて読み込まれる COM DLL は、DLL の CoInitialize 読み込みまたは開始に使用されるスレッドで関数または CoUninitialize 関数を呼び出すべきではありません。 これらのスレッドは、クライアント アプリケーション、COM ランタイム、または COM+ ランタイムによって所有されます。 COM DLL によって明示的に作成された追加のスレッドでは、COM DLL のみがこれらの API を呼び出す必要があります。 ただし、COM DLL では、イベントをアタッチし、関数内のイベントDllMainCoInitializeデタッチするために関数と関数をCoUninitialize呼び出すのが一般的なバグです。

注:

標準の Win32 DLL で COM API を使用する予定の場合は、COM 経由で読み込まれない標準の Win32 DLL でこれらの API を呼び出すのが正しいことです。 ただし、これらの関数は関数から DllMain 呼び出すべきではありません。

関数の詳細 CoInitialize については、「 CoInitialize 関数」を参照してください。

関数の詳細 DllMain については、「 DllMain エントリ ポイント」を参照してください。

注:

このバグを含む Microsoft コンポーネントの 1 つは 、Cdo.dll コンポーネントです。 このコンポーネントはマルチスレッド環境ではサポートされていません。 代わりに、 Cdosys.dll コンポーネントまたは Cdonts.dll コンポーネントを使用することをお勧めします。

詳細情報

影響を受けるコードが含まれている COM コンポーネントを確認するには、Microsoft インターネット インフォメーション サービス (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し、[OK] をクリック します
    6. [ルールの追加] をクリックします。
    7. [ クラッシュ] をクリックし、[ 次へ] をクリックします。
    8. 特定の MTS/COM+ アプリケーション (高および中分離 Web サイトを含む) をクリックし、[次へ] をクリックします。
    9. 適切な COM+ アプリケーションをクリックし、[ 次へ] をクリックします。
    10. [ 高度な構成 (省略可能)] ダイアログ ボックスで、[ ブレークポイント] をクリックします。
    11. [ ブレークポイントの構成 ] ダイアログ ボックスで、[ ブレークポイントの追加] をクリックします。
    12. [ブレークポイントの構成] ダイアログ ボックスで、「ole32![ブレークポイント式] フィールドに CoInitializeEx を入力し、[アクションの種類] フィールドに「1000」と入力し、[アクションの種類] フィールドにログ スタック トレースを保持して、[OK] をクリックします
    13. [ ブレークポイントの構成 ] ダイアログ ボックスで、[ ブレークポイントの追加] をクリックします。
    14. [ブレークポイントの構成] ダイアログ ボックスで、「ole32![ブレークポイント式] フィールドに CoUninitialize を入力し、[アクションの制限] フィールドに「1000」と入力して、[OK] をクリックします
    15. [ブレークポイントの構成] ダイアログ ボックスで、[閉じる保存&] をクリックします。
    16. [ 高度な構成 (省略可能)] ダイアログ ボックスで、[ 次へ] をクリックします。
    17. [ ダンプの場所と規則名の選択 (省略可能)] ダイアログ ボックスで、[ 次へ] をクリックします。
    18. [ ルールの完了 ] ダイアログ ボックスで、[ 今すぐルールをアクティブ化] をクリックし、[完了] をクリック します

DebugDiag は、アプリケーションの実行時に、選択した COM+ アプリケーションを監視します。 DebugDiag で選択したブレークポイントの 1 つが発生するたびに、DebugDiag はログ ファイルにデータを追加します。 既定では、ログ ファイルには次の名前が付けられます。
C:\Program Files\IIS Resources\DebugDiag\Logs\dllhost__PID__\<pid>\__Date__\<date> __Time\_\<time> Log.txt

アプリケーションでエラーが発生した場合は、該当するログ ファイルを確認して、影響を受ける DLL を見つけます。 次の例では、影響を受ける COM コンポーネントは Mybaddll.dllです。 次の呼び出し履歴は、COM+ ランタイムから直接行われる 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