클라이언트 애플리케이션은 COM+ 구성 요소를 만들려고 할 때 간헐적으로 오류 메시지를 받을 수 있습니다.
- 아티클
- 2023. 07. 17.
이 문서의 내용
이 문서는 클라이언트 애플리케이션이 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.Runtime.Type.CreateInstanceImpl(Boolean publicOnly)의 System.Activator.CreateInstance(Type type, Boolean nonPublic)(_HResult = 0x80070057/-2147024809)에서 "매개 변수가 잘못되었습니다."
COM+ 애플리케이션은 일반적으로 COM+ 애플리케이션이 열린 직후 잠시 동안 오류 없이 작동합니다. 이 문제는 간헐적으로 발생하지만 애플리케이션이 모든 활성화 요청에서 실패할 때까지 시간이 지남에 따라 빈도가 증가합니다.
원인
이 문제는 함수와 함수가 호출될 때 CoInitialize 스레드에 대한 COM(구성 요소 개체 모델) 초기화 수가 증가 및 CoUninitialize 감소하기 때문에 발생합니다. 함수를 호출한 후 이 수가 0에 CoUninitialize 도달하면 COM은 스레드에서 초기화되지 않습니다. COM+ STA ThreadPool 스레드를 초기화하지 않으면 스레드의 아파트 활성화기가 제거됩니다. 이 스레드로 라우팅되는 다음 활성화 요청은 E_INVALIDARG 오류 메시지와 함께 실패합니다. 이 문제는 스레드 아파트 활성화자를 더 이상 사용할 수 없기 때문에 발생합니다. 초기화되지 않은 특정 스레드로 라우팅되는 활성화 요청만 실패합니다. 더 많은 COM+ ThreadPool 스레드가 초기화되지 않으면 더 많은 요청이 실패합니다. 모든 COM+ ThreadPool 스레드가 초기화되지 않으면 모든 요청이 실패합니다. 프로세스가 다시 시작되면 잠시 동안 문제가 복구됩니다. 그러나 주기가 반복됩니다.
해결 방법
이 문제를 해결하려면 영향을 받는 COM DLL에서 호출 및 CoUninitialize 호출을 제거 CoInitialize 합니다. COM 구성 요소를 노출하고 클라이언트에서 COM 호출을 통해 로드되는 COM DLL은 DLL을 로드하거나 시작하는 데 사용되는 스레드에서 함수 또는 CoUninitialize 함수를 호출 CoInitialize 해서는 안 됩니다. 이러한 스레드는 클라이언트 애플리케이션, COM 런타임 또는 COM+ 런타임에서 소유합니다. COM DLL에서 명시적으로 만든 추가 스레드에서 COM DLL만 이러한 API를 호출해야 합니다. 그러나 COM DLL이 함수에서 이벤트를 연결하고 이벤트를 DllMain 분리하기 위해 함수와 CoUninitialize 함수를 호출 CoInitialize 하는 것은 일반적인 버그입니다.
참고
표준 Win32 DLL이 COM API를 사용할 계획인 경우 COM을 통해 로드되지 않은 표준 Win32 DLL에서 이러한 API를 호출하는 것이 맞습니다. 그러나 이러한 함수는 함수에서 DllMain 호출해서는 안 됩니다.
함수에 CoInitialize 대한 자세한 내용은 CoInitialize 함수를 참조하세요.
함수에 대한 DllMain 자세한 내용은 DllMain 진입점을 참조하세요.
참고
이 버그가 포함된 Microsoft 구성 요소 중 하나는 Cdo.dll 구성 요소입니다. 이 구성 요소는 다중 스레드 환경에서 지원되지 않습니다. 대신Cdosys.dll구성 요소 또는 Cdonts.dll 구성 요소를 사용하는 것이 좋습니다.
추가 정보
영향을 받는 코드를 포함하는 COM 구성 요소를 확인하려면 Microsoft 인터넷 정보 서비스(IIS) 디버그 진단 도구(DebugDiag)를 사용합니다. 이렇게 하려면 다음과 같이 하십시오.
- DebugDiag를 다운로드하여 설치합니다.
- DebugDiag에서 크래시 규칙을 만듭니다. 이렇게 하려면 다음과 같이 하십시오.
- 시작을 클릭하고 프로그램을 가리키고 IIS 진단(32비트)을 가리킨 다음 진단 도구 디버그를 가리킨 다음 진단 도구 1.0 디버그를 클릭합니다.
- 규칙 유형 선택 대화 상자가 열리면 [취소]를 클릭합니다.
- 도구 메뉴에서 옵션 및 설정을 클릭합니다.
- 폴더 및 검색 경로 탭을 클릭한 다음 분석용 기호 검색 경로 필드에 입력 srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols 합니다.
- 디버깅을 위한 기호 검색 경로 필드에 를 입력srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols한 다음 확인을 클릭합니다.
- 규칙 추가를 클릭합니다.
- 충돌을 클릭한 다음 다음을 클릭합니다.
- 특정 MTS/COM+ 애플리케이션(상위 및 중간 격리 웹 사이트 포함)을 클릭한 다음 다음을 클릭합니다.
- 적절한 COM+ 애플리케이션을 클릭한 다음 다음을 클릭합니다.
- 고급 구성(선택 사항) 대화 상자에서 중단점을 클릭합니다.
- 중단점 구성 대화 상자에서 중단점 추가를 클릭합니다.
- 중단점 구성 대화 상자에서 ole32! 중단점 식 필드에 CoInitializeEx를 입력하고 작업 유형 필드에 1000을 입력하고 작업 유형 필드에 로그 스택 추적을 유지한 다음 확인을 클릭합니다.
- 중단점 구성 대화 상자에서 중단점 추가를 클릭합니다.
- 중단점 구성 대화 상자에서 ole32! 중단점 식 필드에 CoUninitialize하고 작업 제한 필드에 1000을 입력한 다음 확인을 클릭합니다.
- 중단점 구성 대화 상자에서 닫기 저장&을 클릭합니다.
- 고급 구성(선택 사항) 대화 상자에서 다음을 클릭합니다.
- 덤프 위치 및 규칙 이름 선택(선택 사항) 대화 상자에서 다음을 클릭합니다.
- 규칙 완료 대화 상자에서 지금 규칙 활성화를 클릭한 다음 마침을 클릭합니다.
DebugDiag는 애플리케이션이 실행될 때 선택한 COM+ 애플리케이션을 모니터링합니다. DebugDiag에서 선택한 중단점 중 하나가 발생할 때마다 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
'[Microsoft]' 카테고리의 다른 글
COM+는 Windows Server에서 프로세스 덤프 파일 및 프로세스 종료의 자동 수집을 지원합니다. (0) | 2023.11.03 |
---|---|
동일한 스레드에서 HtmlHelp 함수를 호출한 후 CoInitializeEx 함수가 실패함 (0) | 2023.11.03 |
Win32_NetworkAdapterConfiguration 클래스는 PPPoE(이더넷을 통해 지점 간 프로토콜) 및 VPN(가상 사설망)에 대한 정보를 검색할 수 없습니다. (0) | 2023.11.03 |
DnsQuery 함수를 사용하여 Visual C++ .NET으로 호스트 이름 및 호스트 주소 확인 (0) | 2023.11.03 |
디자인 문제 - Winsock을 사용하여 TCP를 통해 작은 데이터 세그먼트 보내기 (0) | 2023.11.03 |