Um aplicativo cliente pode receber intermitentemente uma mensagem de erro quando um aplicativo cliente tenta criar um componente COM +

O suporte para o Windows XP terminou

A Microsoft terminou o suporte para o Windows XP em 8 de abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

O suporte para o Windows Server 2003 termina em 14 de julho de 2015.

A Microsoft terminou o suporte para o Windows Server 2003 em 14 de julho de 2015. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 911359

Sintomas
Quando um aplicativo cliente tenta criar um componente Microsoft COM +, o aplicativo cliente pode receber intermitentemente uma mensagem de erro. Aplicativos do Microsoft C++ receberá a seguinte mensagem de erro:
E_INVALIDARG: "O parâmetro está incorreto" (0 x 80070057 /-2147024809)
Aplicativos do Microsoft Visual Basic 6.0 receberá a seguinte mensagem de erro:
Erro em tempo de execução '5': "argumento ou chamada de procedimento inválida" (0x800a0005/2146828283)
Aplicativos cliente que são criados no Microsoft .NET Framework receberá a seguinte mensagem de erro:
System.ArgumentException: "O parâmetro está incorreto." em System.Runtime.Type.CreateInstanceImpl (Boolean publicOnly) em System.Activator.CreateInstance (tipo de tipo, Boolean nonPublic) (com _HResult = 0 x 80070057 /-2147024809)
O aplicativo do COM + funcionará normalmente sem erro por algum tempo imediatamente após o aplicativo do COM + é aberto. O problema ocorre intermitentemente, mas aumenta na freqüência com o tempo até que o aplicativo finalmente falha em cada solicitação de ativação.

Observação Quando o aplicativo cliente está sendo executado em um computador remoto, a seguinte mensagem de erro é registrada no log de eventos do sistema no computador cliente:

Tipo de evento: erro
Origem do evento: DCOM
Categoria do evento: nenhum
IDENTIFICAÇÃO de evento: 10006
Descrição:
DCOM obteve o erro "um ou mais argumentos são inválidos" do computador SERVERNAME ao tentar ativar o servidor: GUID

Causa
Esse problema ocorre porque a "contagem de inicialização de COM" para um segmento é incrementada e diminuída quando a função CoInitialize e a função CoUninitialize são chamados. Quando essa contagem chegar a zero depois que você chamar a função CoUninitialize , COM irá ser não inicializado no thread. Quando um thread de ThreadPool de STA COM + não foi inicializado, apartment ativador do thread é destruído. A próxima solicitação de ativação é roteada para este thread falhará com a mensagem de erro E_INVALIDARG. Esse problema ocorre porque o ativador de apartment thread não está mais disponível. Apenas solicitações de ativação que são roteadas para o segmento não inicializado específico falhará. Conforme mais segmentos de COM + ThreadPool tornam-se não inicializados, uma porcentagem maior de solicitações falhará. Quando todos os threads + ThreadPool se tornam não inicializados, todas as solicitações falhará. Se o processo for reiniciado, o problema irá recuperar por algum tempo. No entanto, o ciclo será repetido.
Resolução
Para resolver esse problema, remova as chamadas CoInitialize e chamadas CoUninitialize da DLL COM afetado. Uma DLL de COM que expõe componentes COM e é carregado por meio de chamadas COM de um cliente não deve chamar a função CoInitialize ou a função CoUninitialize em qualquer segmento que é usado para carregar ou para iniciar a DLL. Esses segmentos são propriedade pelo aplicativo cliente, pelo tempo de execução COM ou pelo runtime do COM +. Somente a DLL de COM deve chamar essas APIs em threads adicionais que foram explicitamente criados pela DLL de COM. No entanto, é um bug comum para DLLs de COM chamar a função CoInitialize e a função CoUninitialize em resposta a eventos de anexar e desanexar eventos na função DllMain .

Observação Está correto para uma DLL Win32 padrão que não é carregado por meio de COM para chamar essas APIs se o padrão DLL Win32 planeja usar COM APIs. No entanto, essas funções não devem ser chamadas de função DllMain .

Para obter mais informações sobre a função CoInitialize , visite o seguinte site da Web Microsoft Developer Network (MSDN): Para obter mais informações sobre a função DllMain , visite o seguinte site da MSDN: Observação Um componente da Microsoft que contém esse bug é o componente CDO.dll. Não há suporte para esse componente em ambientes multithread. Em vez disso, recomendamos que você use o componente CDOSYS.dll ou o componente de CDONTS.dll. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
247288Não há suporte para aplicativos CDO no MTS ou COM +
Mais Informações
Para determinar qual componente COM contém o código afetado, use o Microsoft Internet Information Services (IIS) ferramenta Debug Diagnostic (DebugDiag). Para fazer isso, execute as seguintes etapas:
  1. Baixe e instale DebugDiag. Escolha uma das seguintes versões:
  2. Crie uma regra falha no DebugDiag. Para fazer isso, execute as seguintes etapas:
    1. Clique em Iniciar , aponte para programas , aponte para o IIS Diagnostics (32 bits) , aponte para a Ferramenta Debug Diagnostics e, em seguida, clique em Debug Diagnostics Tool 1.0 .
    2. Se abrir a caixa de diálogo Selecionar tipo de regra , clique em Cancelar .
    3. No menu Ferramentas , clique em Opções E configurações .
    4. Clique na guia pastas e caminhos de pesquisa e, em seguida, digite srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols no campo Symbol Search Path para análise .
    5. No campo Symbol Search Path para depuração , digite srv*C:\symsrv\*http://msdl.microsoft.com/download/symbols e, em seguida, clique em OK .
    6. Clique em Adicionar regra .
    7. Clique em Pane e em seguida, clique em Avançar .
    8. Clique em um específico MTS / aplicativo COM + (sites incluídos isolamento médio e alto) e em seguida, clique em Avançar .
    9. Clique no aplicativo COM + apropriado e, em seguida, clique em Avançar .
    10. Na caixa de diálogo Configuração avançada (opcional) , clique em pontos de interrupção .
    11. Na caixa de diálogo Configurar pontos de interrupção , clique em Adicionar ponto de interrupção .
    12. Na caixa de diálogo Configurar pontos de interrupção , digite ole32! CoInitializeEx no campo Expressão de ponto de interrupção , digite 1000 no campo Tipo de ação , manter o Log de rastreamento de pilha no campo Tipo de ação e, em seguida, clique em OK .
    13. Na caixa de diálogo Configurar pontos de interrupção , clique em Adicionar ponto de interrupção .
    14. Na caixa de diálogo Configurar pontos de interrupção , digite ole32! CoUninitialize no campo Expressão de ponto de interrupção , digite 1000 no campo Limite de ação e, em seguida, clique em OK .
    15. Na caixa de diálogo Configurar pontos de interrupção , clique em Salvar & fechar .
    16. Na caixa de diálogo Configuração avançada (opcional) , clique em Avançar .
    17. Na caixa de diálogo Selecionar despejo local e nome da regra (opcional) , clique em Avançar .
    18. Na caixa de diálogo Regra concluída , clique em Activate the rule now e em seguida, clique em Concluir .
DebugDiag monitora o aplicativo do COM + selecionado quando o aplicativo é executado. Sempre que DebugDiag enfrenta um dos pontos de interrupção selecionados, DebugDiag adiciona dados a um arquivo de log. Por padrão, o arquivo de log será nomeado "C:\Program Files\IIS Resources\DebugDiag\Logs\dllhost__PID__ <pid> __Date__ <date> __Time_ <time> log.txt. "

Quando ocorre um erro no aplicativo, examine o arquivo de log apropriado para localizar a DLL afetada. No exemplo a seguir, o componente de COM afetado está Mybaddll.dll. As pilhas de chamada seguintes são exemplos de esperado chamadas de API que estão diretamente do tempo de execução do COM +:
[10/27/2005 10:03:42 AM] Breakpoint at ole32!CoInitializeEx caused by 3500[10/27/2005 10:03:42 AM] Stack TraceChildEBP RetAddr  Args to Child              0097ff38 7668c062 00000000 00000002 7c910732 ole32!CoInitializeEx0097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x6c0097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa90097ffec 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 TraceChildEBP RetAddr  Args to Child              006dff08 766f965b 00000000 000b9838 00037138 ole32!CoUninitialize006dff70 766f9742 000b9838 00037258 006dffb4 COMSVCS!WORK_QUEUE::WorkerLoop+0x248006dff80 77c3a3b0 000b9838 00000000 7c9105c8 COMSVCS!WORK_QUEUE::ThreadLoop+0x19006dffb4 7c80b50b 00037138 00000000 7c9105c8 msvcrt!_endthreadex+0xa9006dffec 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 TraceChildEBP RetAddr  Args to Child              0007fd98 0100128e 00092388 00000000 0007fdbc ole32!CoUninitialize0007ff1c 010015b0 01000000 00000000 00092388 dllhost!WinMain+0xd00007ffc0 7c816d4f 00098610 005df0fc 7ffdb000 dllhost!WinMainCRTStartup+0x1740007fff0 00000000 0100143c 00000000 78746341 kernel32!BaseProcessStart+0x23

As pilhas de chamada seguintes são exemplos de chamadas de API inesperados de uma DLL personalizada:
[10/27/2005 10:03:49 AM] Breakpoint at ole32!CoInitializeEx caused by 3500[10/27/2005 10:03:42 AM] Stack TraceChildEBP RetAddr  Args to Child              0097e684 1001349c 00000000 00000001 0097e7cc ole32!CoInitialize0097e76c 100293ca 10000000 00000001 00000000 MyBadDLL!DllMain+0x4c0097e7b8 7c9011a7 10000000 00000001 00000000 MyBadDLL!_DllMainCRTStartup+0xca0097e7d8 7c91cbab 10011712 10000000 00000001 ntdll!LdrpCallInitRoutine+0x140097e8e0 7c916178 00000000 c0150008 00000000 ntdll!LdrpRunInitializeRoutines+0x3440097eb8c 7c9162da 00000000 000c6a30 0097ee80 ntdll!LdrpLoadDll+0x3e50097ee34 7c801bb9 000c6a30 0097ee80 0097ee60 ntdll!LdrLoadDll+0x2300097ee9c 7752e1b1 0097ef18 00000000 00000008 kernel32!LoadLibraryExW+0x18e0097eec0 7752e0cd 0097ef18 0097eee4 0097eee8 ole32!CClassCache::CDllPathEntry::LoadDll+0x6c0097eef0 7752d550 0097ef18 0097f1f4 0097ef10 ole32!CClassCache::CDllPathEntry::Create_rl+0x370097f13c 7752d473 00000001 0097f1f4 0097f16c ole32!CClassCache::CClassEntry::CreateDllClassEntry_rl+0xd60097f184 7752d3d1 00000001 000ba820 0097f1ac ole32!CClassCache::GetClassObjectActivator+0x1950097f1b0 7752cf3b 0097f1f4 00000000 000d82c4 ole32!CClassCache::GetClassObject+0x230097f22c 7752cddf 77607150 00000000 000d82c4 ole32!CServerContextActivator::CreateInstance+0x1060097f26c 76672d76 000d82c4 00000000 0097f33c ole32!ActivationPropertiesIn::DelegateCreateInstance+0xf70097f2e0 7752cddf 000cba80 00000000 000d82c4 COMSVCS!CObjectActivator::CreateInstance+0x21c0097f320 7759699a 000d82c4 00000000 0097f33c ole32!ActivationPropertiesIn::DelegateCreateInstance+0xf70097f340 775877e1 000cf170 000b492c 00000000 ole32!DoServerContextCCI+0x1d0097f38c 775880cf 00000000 000b492c 7759697d ole32!EnterForCallback+0xc20097f4ec 77563258 0097f3c4 7759697d 000cf170 ole32!SwitchForCallback+0x1a30097f518 7751929f 000b492c 7759697d 000cf170 ole32!PerformCallback+0x540097f5b0 7758a738 00099940 7759697d 000cf170 ole32!CObjectContext::InternalContextCallback+0x1550097f5d0 77596ba1 00099940 7759697d 000cf170 ole32!CObjectContext::DoCallback+0x1c0097f5fc 77567439 77607154 000d82c4 000d0ba0 ole32!CApartmentActivator::ContextCallHelper+0x4e0097f658 77e79dc9 77607154 00000000 000d82c4 ole32!CApartmentActivator::CreateInstance+0x1100097f67c 77ef321a 7752cfbc 0097f690 00000004 RPCRT4!Invoke+0x300097fa88 77ef3bf3 000d8ea0 000cfc04 000cecb4 RPCRT4!NdrStubCall2+0x2970097fae0 77600c31 000d8ea0 000cecb4 000cfc04 RPCRT4!CStdStubBuffer_Invoke+0xc60097fb20 77600bdb 000cecb4 000b689c 00000000 ole32!SyncStubInvoke+0x330097fb68 7750f237 000cecb4 000d5de8 000d8ea0 ole32!StubInvoke+0xa70097fc40 7750f15c 000cfc04 00000000 000d8ea0 ole32!CCtxComChnl::ContextInvoke+0xe30097fc5c 7750fc79 000cecb4 00000001 000d8ea0 ole32!MTAInvoke+0x1a0097fc88 77600e3b 000cecb4 00000001 000d8ea0 ole32!STAInvoke+0x4a0097fcbc 776009bc 000cec60 000cfc04 000d8ea0 ole32!AppInvoke+0x7e0097fd90 77600df2 000cec60 000b1b10 00000000 ole32!ComInvokeWithLockAndIPID+0x2e00097fdbc 7750fcb3 000cec60 00000400 000d1d88 ole32!ComInvoke+0x600097fdd0 7750fae9 000cec60 0097fe50 7750fa56 ole32!ThreadDispatch+0x230097fde8 77d48734 002f07c8 000c7d08 0000babe ole32!ThreadWndProc+0xfe0097fe14 77d48816 7750fa56 002f07c8 00000400 USER32!InternalCallWinProc+0x280097fe7c 77d489cd 00000000 7750fa56 002f07c8 USER32!UserCallWinProcCheckWow+0x1500097fedc 77d48a10 000de3fc 00000000 0097ff08 USER32!DispatchMessageWorker+0x3060097feec 7668b57c 000de3fc 000de3f8 000de370 USER32!DispatchMessageW+0xf0097ff08 7668b42d 000de390 000de370 000de3ec COMSVCS!CSTAQueueLessMessageWork::DoWork+0x4e0097ff20 7668bea5 000de3f8 7668c2d0 000de370 COMSVCS!CSTAThread::DoWork+0x180097ff40 7668c197 7c910732 0003c9a8 0003e018 COMSVCS!CSTAThread::ProcessQueueWork+0x470097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x1a10097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa90097ffec 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 TraceChildEBP RetAddr  Args to Child              0097f9f4 100134e5 0097fb7c 0097fb38 10011712 ole32!CoUninitialize0097fad8 100293ca 10000000 00000000 00000000 MyBadDLL!DllMain+0x950097fb24 7c9011a7 10000000 00000000 00000000 MyBadDLL!_DllMainCRTStartup+0xca0097fb44 7c91e6f4 10011712 10000000 00000000 ntdll!LdrpCallInitRoutine+0x140097fc3c 7c80aa7f 10000000 0097fc90 0097fdb0 ntdll!LdrUnloadDll+0x41c0097fc50 77513442 10000000 0097fdd0 77513456 kernel32!FreeLibrary+0x3f0097fc5c 77513456 0097fc9c 776067e0 00000000 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish+0x2f0097fc70 775135fe 774e1ab0 00000000 00000000 ole32!CClassCache::CFinishComposite::Finish+0x1d0097fdd0 77513578 ffffffff 000c7d08 0097fe1c ole32!CClassCache::FreeUnused+0x19d0097fde0 775133a2 ffffffff 00000000 7668b359 ole32!CoFreeUnusedLibrariesEx+0x360097fdec 7668b359 77d48734 00000000 00000113 ole32!CoFreeUnusedLibraries+0x90097fdf0 77d48734 00000000 00000113 0000705b COMSVCS!STAFreeLibTimerProc+0x60097fe1c 77d49857 7668b353 00000000 00000113 USER32!InternalCallWinProc+0x280097fe84 77d49791 00000000 7668b353 00000000 USER32!UserCallWinProc+0xf30097fedc 77d48a10 000de3fc 00000000 0097ff08 USER32!DispatchMessageWorker+0x10e0097feec 7668b57c 000de3fc 000de3f8 000de370 USER32!DispatchMessageW+0xf0097ff08 7668b42d 000de390 000de370 000de3ec COMSVCS!CSTAQueueLessMessageWork::DoWork+0x4e0097ff20 7668bea5 000de3f8 7668c2d0 000de370 COMSVCS!CSTAThread::DoWork+0x180097ff40 7668c197 7c910732 0003c9a8 0003e018 COMSVCS!CSTAThread::ProcessQueueWork+0x470097ff80 77c3a3b0 000de370 7c910732 00000005 COMSVCS!CSTAThread::WorkerLoop+0x1a10097ffb4 7c80b50b 0003e018 7c910732 00000005 msvcrt!_endthreadex+0xa90097ffec 00000000 77c3a341 0003e018 00000000 kernel32!BaseThreadStart+0x37

Aviso: este artigo foi traduzido automaticamente

Proprietăți

ID articol: 911359 - Ultima examinare: 12/05/2007 09:37:57 - Revizie: 3.4

Microsoft COM+ 1.0, Microsoft COM+ 1.5, Microsoft Windows Server 2003, Enterprise Edition (32-bit x86), Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems, Microsoft Windows Server 2003, Enterprise x64 Edition, Microsoft Windows Server 2003, Standard Edition (32-bit x86), Microsoft Windows Server 2003, Standard x64 Edition, the operating system: Microsoft Windows 2000, Professional, the operating system: Microsoft Windows 2000, Server, Microsoft Windows XP Home Edition, Microsoft Windows XP Professional

  • kbmt kbfix kbprb KB911359 KbMtpt
Feedback