Nov 29 2006

Delphi: Exemplo utilizando CreateProcess

Autor: Marcos Dell Antonio - Categorias: Delphi

Já comentei há alguns dias que existem três formas para rodar uma aplicação externa em um programa escrito em Delphi. São elas: ShellExecute, WinExec e CreateProcess.

Ontem precisei executar o MySQL Dump para gerar um backup de uma base de dados. Até aqui nenhum segredo, pois o WinExec faz isso facilmente. No entanto, eu precisava manter a aplicação esperando até que o comando terminasse de executar.

A única forma de fazer isto é utilizando o CreateProcess. Veja a rotina que utilizei:

Exemplo utilizando o CreateProcess
Download do código fonte

Para realizar o dump, usei o seguinte comando:

cmd.exe /c “c:\executavel\Utils\mysqldump.exe -hHOST -uUSUARIO -pSENHA -c –add-drop-table teste > C:\teste.sql”

Algumas informações importantes sobre esta rotina:

  • O CreateProcess requer vários parâmetros. No entanto, veja que a rotina acima pede um só, portanto ela assume um comportamento padrão;
  • Enquanto a aplicação externa está em execução, o programa que criou ela fica esperando (graças ao WaitForSingleObject);
  • Como utilizei o cmd.exe para rodar o MySQL Dump, precisei passar o nome do executável e seus parâmetros dentro de ” ” (até descobrir isso passaram-se algumas horas);
  • A aplicação criada é executada em modo SW_HIDE, ou seja, escondida.

Fonte: Dicas de Delphi

Não deixe de conferir as sugestões de livros sobre Delphi que eu elaborei. Lá você encontrará informações sobre este e outros comandos.

É isso aí! T+ :P

Adicione ao del.icio.us del.icio.us | Adicione ao Rec6 Rec6

16 comentários para “Delphi: Exemplo utilizando CreateProcess”

  1. HPJem 23 Mar 2007 10:03 am

    Olá estou usando o delphi 8 e o compilador não reconhece a função fillchar.
    Vc pode me ajudar ?

  2. Marcosem 23 Mar 2007 1:30 pm

    Opa.

    Você deu um uses na unit System?

    T+

  3. [...] CreateProcess: o substituto do WinExec e, certamente, a melhor opção. Possui uma lista gigante de parâmetros, mas muitos deles não são utilizados e podem ser passados como nil ou 0 (zero). Veja um exemplo desde comando aqui. [...]

  4. danielem 25 Jul 2007 11:25 am

    Funciona no .net?

  5. Marcos Dell Antonioem 25 Jul 2007 6:31 pm

    Talvez com P/Invoke ou algo do gênero ;)

    T+

  6. marceloem 20 Sep 2007 4:48 pm

    Olá…
    será que alguém pode me ajudar?
    Tenho uma aplicação que chama outro executável, já utilizei o CreateProcess, o WinExec e o ShellExecute, todos deram certo para chamar o outro executável, no entanto eu gostaria é que se o executável estiver aberto ele restaurar e não abrir um novo.
    Utilizei também o seguinte código:
    ——————————-
    TesteExecutável := FindWindow(nil,’Caption do formulário principal’);
    if TesteExecutável 0 then
    SetForegroundWindow(TesteExecutável)
    else
    ShellExecute(Handle,’Open’,'Executável’,nil,’diretório’,sw_shownormal);
    ——————————-

    Este código dá certo, acontece que se o executável estiver no form principal funciona tudo certinho, mas se o executável tiver aberto qualquer outra tela(ShowModal) o programa abre a tela principal deixando esta outra tela(ShowModal) atráz fazendo com que o executável trave uma vez que o formulário ativo ficou por tráz do form principal.

    Se alguém tiver uma solução para isso ficaria muito grato.

    Desde já agradeço.

  7. Ericem 18 Oct 2007 11:17 am

    Caro Marcos,

    Cara essa rotina CreateProcess resolveu minha vida :D eu usava o winexec com um sleep depois para aguardar mais isso era uma m%$%#$%. Obrigado

  8. Gilbertoem 22 Nov 2007 10:06 pm

    Marcos,

    Funcionou perfeitamente, utilizei com o mesmo propósito que o seu, só que no meu caso utilizei para o PostgreSQL.

    Parabéns, excelente dica.

    Gilberto

  9. Humbertoem 18 Dec 2007 1:35 pm

    Pessoal,

    essa função (CreateProcess), poderia ser usado em um windows service?

    Preciso abrir uma aplicação, mas ela fica escondida, não abre uma janela.

    Alguma sugestão???

  10. Lucasem 04 Jan 2008 10:03 am

    Ola,
    estou trabalhando com o a mesma função porem quando o WaitForSingleObject estra em ação ele para o sistema todo, eu precisaria que pelo menos um form dele continua-se em execução normal.
    Existe alguma outra função que não parace o sistema todo … ou q faça algo parecido ?

    Obrigado pela atenção
    Adios

  11. Deophanesem 11 Jan 2008 2:09 pm

    Enquanto a aplicação externa está em execução, o programa que criou ela fica esperando (graças ao WaitForSingleObject). Tem como deixar as duas funcionando sumultaneamente, pois tirei esse comando e não deu certo.

  12. Andréem 27 Sep 2008 5:34 pm

    Me perdoem por comentar um post de 2006, mas só hoje me deparei com a necessidade de usar esta rotina. Funciona perfeitamente meu unico problema é que ela estará dentro de um software que distribuirei entre os funcionarios de uma grande empresa e me pergunto sobre a questao de segurança.

    Rodando um analisador de processos do windows, vejo la claramente a senha passada pelo controle.

    caso queiram ver com os proprios olhos o link do sistema que estou usando para monitorar estes processos é:
    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

    minha duvida… nao existe a possibilidade de criar o processo… aguardar que ele me solicite outras informações ou até mesmo automatizar isso…

    Podendo-se “ler” a saida do console, como por exemplo.. executarmos lá o comando

    “cmd.exe /c date”

    o console ira aguardar com a seguinte entrada:
    “Data atual: sáb 27/09/2008
    Digite a nova data: (dd-mm-aa)”

    como eu consigo informar estes dados sem a intervenção do usuario ?

    a idéia é fornecer os dados de segurança como login e senha depois de executado, e não na linha de comando.

    teoricamente, ficaria mais dificil de ser visto essas informaços se passados como um input no console e não diretamente via parametros.

    caso alguem consiga resolver isto me dê uma luz. estou procurando esta resposta a dias sem nenhum sucesso ate o presente momento.

    deixo aqui meu email para caso uma boa alma apareça…

    campsoft@gmail.com

    Grato. !

  13. alexem 06 Oct 2008 9:34 pm

    e como chamar o visualizador de imagens do windows ??

  14. alexem 07 Oct 2008 1:49 pm

    como executo o visualisador de imagens do windows atraves do delphi ?

  15. Ricardoem 03 Dec 2008 5:06 pm

    Estou querendo chamar um programa externo dentro de um serviço que criei no delphi.. usando timer,, o serviço fica verificando se o programa externo está aberto, se não estiver ele abre.. e funciona… mas o form não abre… é necessário fazer alguma coisa?

    Obrigado

  16. Lucas Ferreiraem 19 Dec 2008 2:45 pm

    Amigo Marcos, tudo bom?
    Tentei realizar esta função, porém não obtive resultado. A função é de 2006 e talvez a IDE de hoje não aceite mais isto. Digo porque estou tentado no Delphi 2009, MySQL 5.0, Windows XP SP2
    Quando executo a função com o mesmo comando seu, alterando somente para minhas atribuições, tais como localhost, username, password, banco de dados, etc.
    Me resulta este erro: “Acess violation at address 7C82F293 in module ‘kernel32.dll’. Write of address 0053F4E6″.
    Poderia me ajudar, como proceder? Nescessito justamente desta função.
    Grato.

Faça um comentário