Delphi: WinExec, ShellExecute ou CreateProcess?

Publicado por Marcos Dell Antonio em 28/11/2006 | Delphi

Quando preciso executar uma aplicação externa através de um executável, posso escolher entre esses três recursos (comandos): WinExec, ShellExecute ou CreateProcess.

Qual a diferença entre eles? O Fundão responde.

Resumidamente:

  • WinExec: simples, porém não recomendado pela própria Microsoft, pois pode ser que futuramente não estará mais disponível;
  • ShellExecute: utilizado quando existe a necessidade de abrir um arquivo conforme sua extensão. Também pode ser usado para rodar um executável qualquer;
  • 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 deste comando aqui.

Para saber mais sobre este e outros comandos, não deixe de conferir as sugestões de livros sobre Delphi que eu elaborei.

É isso aí. Até +!

19 comentários

  1. 1
    Marcos // December 27th, 2006 at 2:53 pm

    Se eu preciso executar um programa

    cmd := ‘”C:\Program Files\Vantive855\vantiv32.exe” ‘+frmLogin.edUsuario.Text+’ ‘+frmLogin.edSenha.Text;

    onde eu estou passando o programa a ser executado o usuário e a senha do sistema. Caso eu não queira abrir
    o progrma, mas apenas verificar se o usuário e a senha estão corretos, tem como eu retornar true e não abrir o programa ?

  2. 2
    Marcos Dell Antonio // January 8th, 2007 at 10:08 pm

    Acho que você poderia forçar o retorno do CreateProcess conforme a situação, veja:

    “Se CreateProcess tiver sucesso o valor de retorno é diferente de zero. Se CreateProcess retorna 0, você deve chamar GetLastError para obter um código de erro indicando o que houve de errado.”

    No seu caso, se o login falhou, faça com que o CreateProcess não obtenha sucesso na execução. Se deu certo, faça com que o retorno seja diferente de zero.

    Até +.

  3. 3
    Flavio // May 30th, 2007 at 7:22 pm

    Duvida

    Gostei da dica, mais voce sabe como posso fazer ao contrario, caso eu tenha uma aplicacao feita em C#(Windows Application) e deseje carregar meu programa em delphi mais sem a necessidade de novamente passar o login para aplicacao, voce me indica alguma rotina para que a aplicacao delphi reconheca que ela foi startada com parametros e nao necessite usar a tela de login.

    EX : cmd pagamento.exe adm adm 1

    como essa rotina ira fica interna no programa ninguem sabera dessa senha administrativa. e caso a aplicacao seja startada com somente pagamento.exe ela ira rodar normalmente solicitando a tela de login.

    Obrigado,

  4. 4
    Ademir // June 13th, 2007 at 9:37 am

    Bom dia!

    Instalei no meu micro o active tracker, um programa, mas quando termina de instalar aparece o erro “createprocess falhou código 2″.

    Você pode me ajudar a solucionar esse problema?

  5. 5
    Marcos Dell Antonio // June 13th, 2007 at 12:07 pm

    Ademir,

    Tem certeza que esta mensagem está no mesmo contexto do post? O CreateProcess que apresentei é um comando/função do Windows.

    Se, e somente se, estivermos falando da mesma coisa, talvez a informação abaixo possa te ajudar:

    ERROR_FILE_NOT_FOUND 2 The system cannot find the file specified.

    T+

  6. 7
    ROSE // October 18th, 2007 at 1:43 pm

    Estou tentando instalar um programa da junta comercial no meu computador, mas da o seguinte erro… falha no winexec resultado 740, alguem pode me orientar o que devo fazer.

  7. 8
    Abinalio // October 27th, 2007 at 8:01 am

    Olá, Colegas

    Preciso, através do Delphi 7, mostrar 5 imagens através do visualizador de imagens do windows, é possivel?
    Tentei usar o ShellExecute, mas só consigo mostrar uma imagem e não 5 ou mais passando como parâmetros.
    Ex.: Tenho uma pasta com muitas fotos, sendo que 5 fotos para cada imovel, tenho no BD o relacionamento entre o imóvel e o nome da foto.

    Abinálio

  8. 9
    Luiz Amável // November 7th, 2007 at 1:54 pm

    Estou tentanto executar em Delphi 7 tanto o WinExec como o ShellExecute, mas quando os executo é aberta uma nova instância do programa junto com uma janela do DOS, sendo que os o comando para executar na janela do DOS

  9. 10
    Luiz Amável // November 7th, 2007 at 1:58 pm

    Estou tentanto executar em Delphi 7 tanto o WinExec como o ShellExecute para executar um arquivo .bat, mas quando tento é aberta uma nova instância do programa junto com uma janela do DOS, sendo que a janela DOS fica travada e não executa o conteúdo do arquivo.

    Ao clicar em um button ele executa um ou outro comando:

    shellexecute (handle, ‘open’, ‘arquivo.bat’, ”, nil, sw_shownormal);

    WinExec(’arquivo.bat’,sw_show)

  10. 11
    alex // March 18th, 2008 at 4:58 pm

    O win exec Como que é a linha de programação. Tipo …
    Que executar a calculadora como seria ?
    Gostaria de um exmplo de aplicação para executala por outro programa.

  11. 12
    alex // October 6th, 2008 at 9:45 pm

    tenho que abrir figuras quando clicar na imagem dela dentro do meu programa em delphi e quero que estas figuras abram diretamente no visualisador de imagens do windows
    entendeu mas nao sei nem qual o nome do visualisador de imagens dentro do windows e quero chama lo ja mostrando a imagem em que cliquei
    entendeu ??? saberia me dizer como ???

  12. 13
    Nicolau Maquiavel // May 6th, 2009 at 11:05 am

    Blz Delphianos?!!

    Entao minha sugestao p/ o Luiz Amavel, aonde esta ‘arquivo.bat’, usar PChar(’arquivo.bat’). Ok

  13. 14
    Adailton // September 19th, 2009 at 10:07 am

    Olá amigos,
    Utilizo delphi 2009 para fazer meus programas, recentemente fiz um usando “CreateProcess” que após a formatação do PC ele instalava todos os driver e programas de forma automática, no XP funciona que é uma beleza, porém no vista e no windows 7 eu tenho que ficar confirmando as permissões de administrador. existe uma maneira de executar “CreateProcess” como administrador sem tem que alterar manualmente os comandos no sistema operacional, ou seja o proprio delphi fará isso.

  14. 15
    Thiago Gaspar // November 4th, 2009 at 3:56 pm

    Parabenizo o autor por manter este post até a presente data, pois mesmo ao longo dos 3 anos de existência, este me ajudou muito e é justamente o que buscava a um bom tempo.

    Muito grato pela dica.

    Abs a todos

  15. 16
    Valdeci // January 5th, 2010 at 8:18 am

    Bom dia pessoal… usei o CreateProcess citado acima, e funcionou blz. Só que o sistema fica observando determinada pasta. Quando é criado o arquivo nessa pasta, o sistema starta uma ECF e emite o cupom inteiro. Concluido a emissão, ele devolve o o número do cupom, etc para uma aplicação em LINUX, utilizando o PSCP. Até aí tudo bem. Só que funciona, digamos, por uns três dias, depois dá estouro de memória na DLL da ecf. Será que é por causa do CreateProcess?

  16. 17
    ricardo // April 10th, 2010 at 10:22 am

    ola por favor me ajuda eu to tentando instalar p msn spybox no meu pc mais quando eu vou executar aparece esse arro
    não foi possivel executar :
    c:/windows/system32/inmbox/wb.exe
    create process falhou;codigo 5
    acesso negado por favor me ajuda
    preciso disso urgente

  17. 18
    Guilherme // April 21st, 2010 at 6:08 pm

    Eu estou tentando abrir um jogo meu e aparece a seguinte mensagem

    CreateProcess falhou; código 5.
    Acesso negado.

  18. 19
    Xprata // May 12th, 2010 at 2:37 pm

    Ola Marcos, estou usando shellexecute, ele funciona quase redondo, o unico problema é: ele chama um executavel e fecha o programa chamador, o executável chamado tem 2 campos para a antrada de dados, o foco vem no desktop e não na nova tela chamada. O curso fica parada no primeiro campos so que o foco não esta na nova tela, tenho que clicar no campo para dar o foco. Saberia dizer o que fazer?
    obrigado

Trackbacks

  1. Marcos Dell Antonio » Delphi: Exemplo utilizando CreateProcess

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé