Pergunta

Existe uma maneira de verificar se um processo do Microsoft Office (ou seja,Word, Excel) travou ao usar o Office Automation?Além disso, se o processo travar, existe uma maneira de encerrá-lo?

Foi útil?

Solução

Deixe-me começar dizendo que não recomendo fazer isso em um serviço em um servidor, mas farei o possível para responder às perguntas.

A execução como um serviço dificulta a limpeza.Por exemplo, com o que você está executando como serviço, sobreviva matando uma palavra travada ou excel.Você pode estar em posição de interromper o serviço.Seu serviço será interrompido se o Word ou Excel estiver neste estado.

Um problema ao tentar testar se ele está travado é que seu teste pode fazer com que uma nova instância do Word seja inicializada e funcione, enquanto aquela em que o serviço está sendo executado ainda estaria travada.

A melhor maneira de determinar se ele está travado é pedir que ele faça o que deveria estar fazendo e verificar os resultados.Eu precisaria saber mais sobre o que ele realmente está fazendo.

Aqui estão alguns comandos para usar em um arquivo em lote para limpeza (ambos devem estar no caminho):

  • sc stop servicename - interrompe o serviço chamado servicename
  • sc start servicename - inicia o serviço chamado servicename
  • sc query servicename - Consulta o status do servicename

  • taskkill /F /IM excel.exe - encerra todas as instâncias do excel.exe

Outras dicas

Lembro-me de fazer isso há alguns anos - estou falando do Office XP ou de 2003 dias, não de 2007.

Obviamente, uma solução melhor para automação atualmente é usar o novo formato XML que descreve docx etc. usando o namespace System.IO.Packaging.

Naquela época, eu costumava notar que sempre que o MSWord chegava ao fim e estava farto, um processo chamado "Dr.Watson" estava rodando na máquina.Esta foi minha primeira pista de que Word havia tropeçado e caído.Às vezes eu posso ver mais de um WINWORD.EXE, mas meu código costumava procurar o bom doutor.Assim que vi isso (em código), matei todos WINWORD.EXE processa o próprio bom doutor e reinicia o processo de tortura do Word :-)

Espero que isso lhe dê algumas pistas sobre o que procurar.

Tudo de bom,

Rob G.

P.S.Posso até conseguir desenterrar o código em meus arquivos se você não acertar!

Posso responder à segunda metade;se você tiver uma referência ao objeto do aplicativo em seu código, basta chamar "Quit" nele:

private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();

Para verificar se há um processo travado, acho que você gostaria de tentar obter alguns dados do aplicativo e ver se obtém resultados em um período de tempo razoável (verifique um cronômetro ou outro thread ou algo assim).Provavelmente existe uma maneira melhor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top