Pergunta

O que é a melhor maneira de executar um programa externo de excel. Ele pode ser executado por vários minutos. Qual é a melhor prática sobre como a esta. Idealmente,

  1. A caixa de diálogo modelo que vamos o usuário saiba que o processo está em execução.
  2. Se o executável falhar, o usuário deve receber uma notificação.
  3. Um tempo limite deve ser executada.
  4. A cancelar botão deve estar na caixa de diálogo.

Mas qualquer melhores práticas são bem-vindos. Estou interessado em soluções com a chamada ou um arquivo .dll ou um arquivo .exe. De preferência algo que trabalha com Excel '03 ou mais cedo, mas eu adoraria ouvir uma razão para mudar para uma versão mais recente também.

Foi útil?

Solução

Você deve verificar se esses dois artigos Microsoft KB

Como a lançar uma aplicação Win32 a partir do Visual Básico e

Como usar um aplicativo de 32 bits para determinar quando um descascadas processo termina

Os dois rapidamente dar-lhe a estrutura para lançar um processo e, em seguida, verificar a sua conclusão. Cada um dos artigos da KB têm algumas referências adicionais que possam ser relevantes.

O artigo Base de Conhecimento último pressupõe que você quer esperar por uma quantidade infinita de tempo para o seu processo de shell ao fim.

Você pode modificar o ret & = WaitForSingleObject (proc.hProcess, INFINITE) chamada de função para retornar depois de uma certa quantidade finita de tempo em milissegundos - substituir INFINITE com um valor positivo representando milissegundos e enrole a coisa toda em um loop Do While. O valor de retorno indica se o processo foi concluído ou o temporizador correu para fora. O valor de retorno será zero se o processo terminou.

Se o valor de retorno é diferente de zero, em seguida, o processo ainda está em execução, mas o controle é dado de volta para a sua aplicação. Durante este tempo, enquanto você tem o controle positivo de sua aplicação, você pode determinar se atualizar algum tipo de status UI, verificar o cancelamento, etc. Ou você pode fazer um loop de novo e esperar um pouco mais.

Há ainda opções adicionais se o programa que você está gastando para é algo que você escreveu. Você poderia ligar para uma de suas janelas e ter as mensagens programa de pós que você pode anexar ao e uso como feedback do estado. Este é provavelmente melhor deixar para um item separado, se você precisa considerá-lo.

Você pode usar a estrutura de processo para obter um valor de retorno do processo chamado. Seu processo não precisa retornar um valor para que isso seja útil.

A minha abordagem geral para este tipo de necessidade é:

  1. dar ao usuário uma caixa de diálogo de status não-modal no início do processo com um botão que, quando clicado irá definir um sinalizador cancelar a ser verificado mais tarde. Fornecendo ao usuário com qualquer estado é provavelmente impossível, assim dando-lhes um tempo decorrido ou um daqueles GIFs animados podem ser úteis na gestão de expectativas.
  2. Inicie o processo
  3. Aguarde até que o processo seja concluído, permitindo o cancelamento verificar cada 500ms
  4. Se o processo estiver concluído, feche o diálogo e continuar junto.
  5. Se o processo não está completo, ver se o usuário atingiu cancelar e se assim for enviar uma mensagem perto o processo de janela. Isso pode não funcionar e que encerra o processo pode ser necessário - cuidado se você fizer isso. Sua melhor aposta pode ser a abandonar o processo se ele não vai fechar corretamente. Você também pode verificar se há um tempo limite neste momento e tentar tomar o mesmo caminho como se o usuário atingiu cancelar.

Espero que isso ajude, Bill.

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