Artigo: 298014 - Última revisão: quarta-feira, 5 de Dezembro de 2007 - Revisão: 5.5

CORRECÇÃO: Criar uma aplicação COM + que utiliza a tabela de interface global (GIT) poderá impasse

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
importante Este artigo contém informações sobre como modificar o registo. Certifique-se de que cópia de segurança do registo antes de o modificar. Certifique-se que sabe como restaurar o registo se ocorrer um problema. Para obter mais informações sobre como efectuar uma cópia de segurança, restaurar e modificar o registo, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
256986  (http://support.microsoft.com/kb/256986/ ) Descrição do registo do Microsoft Windows
Expandir tudo | Reduzir tudo

Sintomas

Um processo + poderá parecer deixar de responder (não reagir). Este problema específico é raro. Tem a depurar a aplicação totalmente diagnosticar o problema. Se detectar este problema, vários threads na apresentação de processo ligue pilhas que envolvem acesso à tabela de interface global (GIT).

Não é necessário aceder a GIT explicitamente no código a detectar este problema. Outro componente que utiliza pode aceder a GIT.

Causa

Este problema poderá ocorrer se uma das seguintes condições for verdadeira:
  • Utiliza o COM + sincronizados actividades e o JScript componentes.
  • Pode utilizar explicitamente o JScript. Por exemplo, pode utilizar o Windows Script Components (WSC) numa aplicação COM +.
  • Pode utilizar o JScript indirectamente. Por exemplo, o Microsoft XML (MSXML) analisador utiliza JScript para efectuar uma transformação XSL.
  • Utilizar + componentes que são escritas utilizando código gerido, tal como o Visual C# ou Visual Basic. NET. Além disso, não explicitamente chamar o método de venda/abate nestes objectos em versões do Microsoft Windows anteriores ao Microsoft Windows Server 2003.

Resolução

Nota
  • Aplicações do COM + que utilizam o Microsoft .NET System.EnterpriseServices.ServicedComponent objectos são também conhecidas como aplicações geridas COM +.
  • Aplicações do COM + que não utilizam objectos do Microsoft .NET System.EnterpriseServices.ServicedComponent são também conhecidas como aplicações não geridas COM +.
Se detectar este problema nas aplicações do COM + que utilizem o Microsoft .NET System.EnterpriseServices.ServicedComponent objectos, certifique-se de que o código do cliente chama o método a venda/abate em todas as ocorrências de ServicedComponent . A abordagem correcta é a utilização sistemática do método de venda/abate pelo cliente de objectos de ServicedComponent para activar a limpeza determinista. Todas as aplicações de cliente são necessárias para ligar as aplicações de cliente para COM a venda/abate do método em todas as instâncias de ServicedComponent , mesmo não gerido.

Se detectar este problema em COM + aplicações que não utilize o Microsoft .NET System.EnterpriseServices.ServicedComponent objectos, pode utilizar um valor de registo denominado GipActivityBypass para resolver o problema. Para utilizar este valor de registo no Microsoft Windows 2000, tem primeiro de instalar o Windows 2000 Service Pack 3 ou obter Microsoft COM + 18.1 o conjunto de correcções.

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
313582  (http://support.microsoft.com/kb/313582/ ) Disponibilidade do Windows 2000 Post-Service Pack 2 + pacote de correcção conjunto 18.1
Para resolver este problema, obtenha o service pack mais recente do Windows 2000. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
260910  (http://support.microsoft.com/kb/260910/ ) Como obter o Windows 2000 service pack mais recente
aviso Podem ocorrer problemas graves se modificar o registo incorrectamente utilizando o Editor de registo ou utilizando outro método. Estes problemas poderão forçar a reinstalação do sistema operativo. Microsoft não garante que estes problemas podem ser resolvidos. Modificar o registo por sua conta e risco.

Para activar a correcção no Windows 2000 ou no Windows XP, tem de criar este valor de registo adicional:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\GipActivityBypass
Para o fazer, siga estes passos:
  1. Inicie o Editor de registo.
  2. Localize e, em seguida, clique a seguinte chave no registo:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3
  3. No menu Editar , aponte para Novo e, em seguida, clique em Valor DWORD (DWORD Value) .
  4. Escreva GipActivityBypass e, em seguida, prima ENTER.
  5. No menu Editar , clique em Modificar .
  6. Escreva 1 e, em seguida, clique em OK .
Se este valor de registo não estiver presente, o valor assumido é zero (FALSE). Por conseguinte, o código GIT tem de aguardar para introduzir a actividade COM +. Este comportamento poderia fazer com que uma condição de impasse. Um valor diferente de zero (verdadeiro) como é mostrado permite que o novo comportamento e, em seguida, evita a condição de impasse.

Nota Este valor de registo irá permitir chamadas para o método GetInterfaceFromGlobal a passar o bloqueio de actividade. Se um não gerida COM + aplicação experiências bloqueios quando chama o método RevokeInterfaceFromGlobal ou método RegisterInterfaceInGlobal , contacte o suporte.

Como contornar

Se detectar este problema nas aplicações do COM + geridos, pode aplicar a correcção descrita no seguinte artigo da base de dados de conhecimento da Microsoft como uma solução temporária:
875503  (http://support.microsoft.com/kb/875503/ ) CORRECÇÃO: Poderão ocorrer fugas de memória, impasses e desempenho lento quando aplicações não chamar o método Dispose todas as instâncias da classe ServicedComponent no .NET Framework
Em alternativa, como uma solução temporária, pode utilizar um valor de registo denominado DisableAsyncFinalization.

Nota Só deve utilizar o valor de registo DisableAsyncFinalization como uma solução temporária enquanto estiver a implementar a solução é mencionada na secção "Resolução". Se depender o valor de registo DisableAsyncFinalization e não utilize o método de venda/abate , ocorrerão da utilização da memória maiores, desempenho e uma possível falha da aplicação.

Para criar
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\System.EnterpriseServices\DisableAsyncFinalization
registo valor no Windows XP ou no Windows 2000, siga estes passos:
  1. Inicie o Editor de registo.
  2. Localize e, em seguida, clique a seguinte chave no registo:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\System.EnterpriseServices
    Nota Se não conseguir localizar a chave de
    System.EnterpriseServices
    em COM3 , crie a chave de registo. Para o fazer, siga estes passos:
    1. No menu Editar , aponte para Novo e, em seguida, clique em chave .
    2. Escreva System.EnterpriseServices e, em seguida, prima ENTER.
  3. No menu Editar , aponte para Novo e, em seguida, clique em Valor DWORD (DWORD Value) .
  4. Escreva DisableAsyncFinalization e, em seguida, prima ENTER.
  5. No menu Editar , clique em Modificar .
  6. Escreva 1 na caixa dados do valor e, em seguida, clique em OK .

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a". Este problema foi corrigido pela primeira vez no Windows 2000 Service Pack 3.

Mais Informação

No exemplo seguinte, a pilha de chamadas mostra um JScript Recolectores lixo que tenta obter uma interface a partir da tabela de interface global. Nota a moldura que contém ole32! CGIPTable::GetInterfaceFromGlobal .
02c3c2d0 77e8366e 00000002 02c3c2f8 00000001 ntdll!_ZwWaitForMultipleObjects@20+0xb
02c3c320 77e260f8 02c3c2f8 00000001 00000000 KERNEL32!WaitForMultipleObjectsEx+0xea
02c3c37c 68fd46f5 02c3c348 06180fd0 ffffffff USER32!MsgWaitForMultipleObjectsEx+0x153
02c3c3a4 68fd5b64 06180fd0 00000001 02c3c404 ole32!CCliModalLoop::BlockFn+0xf8
02c3c408 695378bc 00079048 ffffffff 00000001 ole32!CoWaitForMultipleHandles+0xe1
02c3c464 69537544 06180fa0 00000001 02c3c758 COMSVCS!?EnterActivity@CActivity@@UAGJHPAUICall@@@Z+0x1be
02c3c474 68fd21f7 06180f90 02c3c758 02c3c7b8 COMSVCS!?Enter@CActivity@@UAGJPAUICall@@@Z+0x14
02c3c4ac 68fd1f78 00000020 00000002 00000001 ole32!CPolicySet::DeliverEvents+0x1f6
02c3c538 68fc8d8e 02c3c758 00000002 02c3c7b8 ole32!CPolicySet::Notify+0x455
02c3c788 68fc8b18 02c3c878 1267104c 68fd9d69 ole32!EnterForCallback+0xe7
02c3c8a8 68fc89f3 1267104c 68fd9d69 0000f024 ole32!SwitchForCallback+0xfb
02c3c8d8 68fcf3fc 1267104c 68fd9d69 0000f024 ole32!PerformCallback+0x70
02c3c934 68fd9eab 00a31e68 68fd9d69 0000f024 ole32!CObjectContext::InternalContextCallback+0x10c
02c3c97c 6b745897 6909a990 0000f024 6b76f888 ole32!CGIPTable::GetInterfaceFromGlobal+0xc1
02c3c9a0 6b7456a0 00000000 00000002 0a5abfb0 jscript!GcContext::CallInContext+0x20
02c3c9c4 6b704f1a 00000002 00000194 0a5ff530 jscript!GcContext::Reclaim+0xba
02c3c9dc 6b729eb8 0a608d88 0a62c008 6b729cae jscript!GcContext::Collect+0xbe
02c3c9e8 6b729cae 77e8357b 0a5ff648 6b72a08e jscript!GcContext::ExhaustiveCollect+0x1a
02c3ca08 6b7329bf 0a5ff530 00000001 0a608d88 jscript!CSession::Close+0x12c
02c3ca18 682fb8f4 0a5ff530 00000000 0a608d88 jscript!COleScript::SetScriptState+0x105
02c3ca28 682fb6b8 0a5cfed8 682fea19 02c3ccac scrobj!ScriptEngine::Close+0x14
02c3ca30 682fea19 02c3ccac 0a5cfed4 00000000 scrobj!ScriptEngine::~ScriptEngine+0x8
02c3ca44 682fe778 127b0fa0 02c3d4ac 00400000 scrobj!ComScriptlet::Inner::~Inner+0x79
02c3ca54 6830562d 0a5cfed0 7c0183c2 0a5e38b0 scrobj!ComScriptlet::Release+0x28
02c3ca5c 7c0183c2 0a5e38b0 68fc8db8 042dfe7c scrobj!ComDexHandler::Inner::Release+0xd
02c3ca64 68fc8db8 042dfe7c 00a30ef4 10b5140c msjava!RemoteReleaseCallback+0xd
02c3ccac 68fc8bb9 02c3cd9c 10b5140c 7c0183b5 ole32!EnterForCallback+0x111
02c3cdcc 68fec807 00079048 7c0183b5 042dfe7c ole32!SwitchForCallback+0x19c
02c3ce00 77d445e0 02c70ff8 00000000 02020202 ole32!CRemoteUnknown::DoCallback+0x72
					
a seguinte pilha de chamadas mostra um componente de serviços Microsoft Enterprise é executado no Microsoft Windows XP. Nota a moldura que contém ole32! CGIPTable::RevokeInterfaceFromGlobal .
036ded74 77f7f49f 77e74bd8 00000001 036dedc0 SharedUserData!SystemCallStub+0x4
036ded78 77e74bd8 00000001 036dedc0 00000001 ntdll!NtWaitForMultipleObjects+0xc
036dee14 77237ce4 00000001 042dd7dc 00000000 kernel32!WaitForMultipleObjectsEx+0x12c
036dee84 7575eb1d 00000000 ffffffff 00000001 ole32!CoWaitForMultipleHandles+0xe0
036deee0 7575e963 042dd790 00000001 036defb8 comsvcs!CActivity::EnterActivity+0x194
036deef0 77237287 042dd780 036defb8 036df070 comsvcs!CActivity::Enter+0x13
036def20 771d9c46 00000020 00000002 036df070 ole32!CPolicySet::DeliverEvents+0x1b4
036def98 77253c5a 036defb8 00000002 036df070 ole32!CPolicySet::Notify+0x31d 
036defec 772543c7 00000000 042bede8 771cb6cd ole32!EnterForCallback+0xb3
036df144 77236722 036df024 771cb6cd 036df19c ole32!SwitchForCallback+0x19a
036df170 7722a047 042bede8 771cb6cd 036df19c ole32!PerformCallback+0x52
036df1a4 77201a4b 04284894 00000000 00090ec0 ole32!ReleaseMarshalObjRef+0x76
036df210 77237f23 036df228 000fefa0 00001b0c ole32!CoReleaseMarshalData+0x7b
036df24c 0377e50d 772b4618 00001b0c 032d2100 ole32!CGIPTable::RevokeInterfaceFromGlobal+0x1a1
036df294 03100971 0106281c 03103cea 032d2100 0x377e50d
036df2d4 79a87bfd 799b0983 036df300 000fefa0 0x3100971
036df2ec 7930a2a8 799b0908 0106281c 00000000 mscorlib_79960000+0x127bfd
036df318 792ad177 799b0908 0106281c 00000000 mscorwks!CTPMethodTable::CallTarget+0x4b
036df338 791b21e7 031f341c 00000000 00000000 mscorwks!CRemotingServices::CreateProxyOrObject+0x57
036df3a4 791b22a1 031f341c 03103c3f 00000002 mscorwks!JIT_NewCrossContextHelper+0x3b
					
para obter informações sobre como obter informações simbólicas enquanto utiliza as ferramentas de depuração, visite o seguinte Web site da Microsoft:
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx (http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx)
Para obter mais informações sobre como instalar o Windows 2000 e as correcções do Windows 2000 ao mesmo tempo, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
249149  (http://support.microsoft.com/kb/249149/ ) Instalar correcções do Microsoft Windows 2000 e Windows 2000
Para obter mais informações sobre a terminologia de actualização de software, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
824684  (http://support.microsoft.com/kb/824684/ ) Descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

A informação contida neste artigo aplica-se a:
  • Microsoft COM+ 1.0 nas seguintes plataformas
    • Microsoft Windows 2000 Professional SP1
    • Microsoft Windows 2000 Server SP1
    • Microsoft Windows 2000 Advanced Server SP1
    • Microsoft Windows 2000 Professional SP2
    • Microsoft Windows 2000 Server SP2
    • Microsoft Windows 2000 Advanced Server SP2
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional Edition
  • Microsoft COM+ 1.5 nas seguintes plataformas
    • Microsoft Windows 2000 Professional SP1
    • Microsoft Windows 2000 Server SP1
    • Microsoft Windows 2000 Advanced Server SP1
    • Microsoft Windows 2000 Professional SP2
    • Microsoft Windows 2000 Server SP2
    • Microsoft Windows 2000 Advanced Server SP2
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional Edition
Palavras-chave: 
kbmt kbbug kbfix kbqfe kbwin2000presp3fix kbwin2000sp3fix KB298014 KbMtpt
Tradução automáticaTradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 298014  (http://support.microsoft.com/kb/298014/en-us/ )