PROBLEMA: Automação COM de processo entre pode travar o aplicativo cliente no Win95/98

Traduções deste artigo Traduções deste artigo
ID do artigo: 216400 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Ao automatizar um servidor de COM fora de processo de um aplicativo cliente, se o código do cliente entra em um loop forte ou faz solicitações abrangentes para obter novas interfaces, o aplicativo cliente pode travar durante uma chamada de automação, exigir que o usuário finalizar o processo de forma anormal. Quando desativados, qualquer solicitação COM uma interface empacotada envolvendo falhará. Uma reinicialização é necessário para limpar o problema.

O problema ocorre apenas em sistemas Windows 95 e Windows 98.

Causa

Quando uma interface é empacotada em limites de processo, um número de objetos do sistema é criado para lidar com comunicação entre processos cliente e servidor. Isso inclui o proxy/stub, juntamente com o OID e OXID necessário por COM para identificar a interface que está sendo empacotada. Quando a interface é lançada pelo processo do cliente, esses objetos serão destruídos durante a coleta de lixo.

Por design, COM usa coleta de lixo lenta para liberar recursos de sistema que não são mais necessários. Essa coleção ocorre durante períodos de relativa inatividade. Se um aplicativo cliente não fornecer o tempo livre suficiente para coleta de lixo ocorrer, é possível que o sistema será recursos insuficiente e não conseguirá mais empacotar interfaces. Se isso acontecer, a camada CONSIGO mesmo pode corrompido, impedindo mais coleta de lixo até que o sistema é reiniciado.

A causa mais comum para o problema é que o código do cliente tiver inserido um loop forte ou está executando um período intenso de automação que envolvem uma hierarquia de objeto aninhado, onde sucessivas chamadas estão sendo feitas para obter e liberar os diversos objetos fora de processo em um curto período de tempo. Por exemplo, o exemplo de código a seguir mostra uma hierarquia de objeto aninhado que requer três interfaces para ser empacotado toda vez que o método PrintOut é chamado. Como o código é executado em um loop forte, o número total de interfaces que está sendo empacotado é 30:
   For i = 1 To 10
      oExcel.ActiveWorkbook.Sheets(i).UsedRange.PrintOut
   Next i
				
em Windows 95 e Windows 98, o número total de interfaces que pode ser empacotado uma vez é aproximadamente 65.536.

Resolução

Os desenvolvedores precisam minimizar o número de referências de objeto que elas solicitam durante loops forte ou períodos pesados de automação. Se uma interface é necessário mais de uma vez, ele deve ser mantido no e usado repetidamente em vez de lançamento e reacquired várias vezes em sucessão.

Por exemplo, esta versão modificada do exemplo acima executa a mesma tarefa, mas requer apenas duas interfaces para ser empacotado para cada chamada de imprimir (uma redução de 30 por cento do código acima):
   Set oBook = oExcel.ActiveWorkbook
   For i = 1 To 10
      oBook.Sheets(i).UsedRange.PrintOut
   Next i
				
outra possível solução pode ser mover alguns o automação de código em andamento para o servidor, se o servidor permitir para scripts em processo. Por exemplo, produtos do Microsoft Office incorporam VBA script para automação interna. Movendo o código de loop em um módulo do VBA, você pode evitar empacotamento várias interfaces e chamar uma macro que permite que o servidor fazer todo o trabalho em vez disso.

Referências

Para obter informações adicionais, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
219905COMO: Adicionar dinamicamente e executar uma macro VBA a partir do Visual Basic

Propriedades

ID do artigo: 216400 - Última revisão: quarta-feira, 24 de janeiro de 2007 - Revisão: 4.4
A informação contida neste artigo aplica-se a:
  • Microsoft Windows 95
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows Millennium Edition
Palavras-chave: 
kbmt kbautomation kboleapp kbprb KB216400 KbMtpt
Traduçã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 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: 216400

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com