Como chamar processo externo?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Como chamar processo externo?

Mensagem por clodoaldomonteiro »

Olá amigos!

É claro que sei como chamar processos externos, executar um aplicativo externo, que seria usando o comando RUN.

A desvantagem é que ele chama uma tela de prompt de comando.

Como já uso o xHarbour estou usando a função HB-OpenProcess, só que tem uma ponto chato, eu quero que a aplicação que chamou o processo externo fique travada, esperando o término do aplicativo chamado, tipo como era no Clipper.

Alguém sabe como fazer isso?
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Como chamar processo externo?

Mensagem por Pablo César »

Com o uso do RUN e o START do sistema operacional, não poderia servir ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como chamar processo externo?

Mensagem por Itamar M. Lins Jr. »

Oi.
No Harbour tem.
* harbour/source/rtl/hbprocfn.c
+ added .prg function:
hb_processRun( <cCommand>, [ <cStdIn> ], [ @<cStdOut> ], ;
[ @<cStdErr> ], [ <lDetach> ] ) -> <nResult>
This function is implemented for all builds also in DOS ones where
temporary files are used to simulate pipes.
TODO: in OS2 builds it should be possible to implement this function
without temporary files just like in *nixes and MS-Windows builds.
I would like to ask OS2 users to make it.
Esse tal lDetach, espera o retorno.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Como chamar processo externo?

Mensagem por Stanis Luksys »

Opa,

Conforme falou nosso colega Iatamar, a hb_processRun é ideal para isso. Antigamente no clipper se você desse um dir via run por exemplo, você precisava jogar num arquivo texto para pegar o retorno. Algo tipo dir > arq.txt. Usando a hb_processRun, você pode pegar o retorno de qualquer comando ou programa numa variável, e sem exibir ele na tela, o que facilita muito.

Se eu não me engano, o programa precisa estar sendo compilado como multi thread (-mt) senão não funciona.

Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Como chamar processo externo?

Mensagem por Pablo César »

Boa explicação Stanis. Obrigado a você e ao Itamar por compartilhar conosco. Eu não sabia, simplesmente fantástico !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Como chamar processo externo?

Mensagem por lugab »

Pesssal,

Fiz ese pequeno teste e deu "ARGUMENT ERROR"

Código: Selecionar todos

TRes=space(200)
Tcmd="dir \winword.exe /s"
hb_ProcessRun(Tcmd,,,TRes)
alert(TRes)
Alguém me orienta ?
lugab
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Como chamar processo externo?

Mensagem por Stanis Luksys »

lugab escreveu:Fiz ese pequeno teste e deu "ARGUMENT ERROR"
Provavelmente porquê você não está passando o paramentro por referência.

Código: Selecionar todos

nResult := 0
cCommand := "ls -Alrth"
cStdOut := Space(1024)
cStdErr := Space(1024)

nResult := hb_processRun( cCommand, , @cStdOut, @cStdErr )

? "O retorno do comando foi:", cStdOut
Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Como chamar processo externo?

Mensagem por lugab »

Valeu a força, Stanys, e executou sem erro de sintaxe...

Mas parece que essa função é furada, pq , apesar de existir tanto a pasta , como o arquivo, o resultado é uma variável em branco em todos os 3 campos...

Código: Selecionar todos

nRetorno := 0
cCommand := "dir \max\empr.dbf"
Campo1:=Campo2:=Campo3:= Space(1024)
nRetorno := hb_processRun( cCommand, @campo1, @campo2 , @Campo3 )

Alert("campo1="+Campo1)
Alert("campo2="+Campo2)
Alert("campo3="+Campo3)


lugab
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Como chamar processo externo?

Mensagem por Stanis Luksys »

Opa,

Eu acho estranho porque nunca se diz assim "acho que estou fazendo errado". Mas prefere-se dizer "acho que a função é furada".

A função, como o nome mesmo diz, abre um processo novo no SO. O comando "dir" nunca vai ser um processo novo, ele é só um comando interpretado pelo command.com. Não existe executável "dir.exe".

Se você der um dir /S que demora uma hora, você pode abrir o gerenciador de tarefas que não vai ver o dir lá, correto? O exemplo que eu dei foi com ls, porque no linux é diferente.


Tente este aqui que vai funcionar:

Código: Selecionar todos

// Teste.prg , este programa se auto compila
Function main()

   Local nResult := 0
   Local cCommand := "hbmk2 Teste.prg"
   Local cStdOut
   Local cStdErr
 
   nResult := hb_processRun( cCommand, , @cStdOut, @cStdErr, .t. )
    
   ? nResult
   ? cStdOut
   ? cStdErr

Return
Existe uma outra forma usando esta função para pegar retorno de comandos, mas agora não estou lembrando, vou ver se acho aqui em algum dos meus programas e depois eu coloco aqui.

Abraços.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Como chamar processo externo?

Mensagem por lugab »

Stanys, desculpe, mas eu me baseei justamente na sua postagem abaixo reproduzida, e, por tabela , supus que essa função serviria para substituir o ato de dar RUN DIR /s > TEMP.TXT, ter q abrir, ler e salvar os dados do arquivo gerado na memória.

Veja:
Conforme falou nosso colega Iatamar, a hb_processRun é ideal para isso.

Antigamente no clipper se você desse um dir via run por exemplo, você precisava jogar num arquivo texto para pegar o retorno. Algo tipo dir > arq.txt.

Usando a hb_processRun, você pode pegar o retorno de qualquer comando ou programa numa variável, e sem exibir ele na tela, o que facilita muito.

Gabriel
lugab
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Como chamar processo externo?

Mensagem por Stanis Luksys »

Foi um exemplo simples.

Muitas vezes chamamos de comandos, aquilo que na verdade são programas no path do sistema.

Quando exemplifiquei dir > arq.txt, eu não quis dizer ao pé da letra para você dar um dir, até mesmo porque se fosse o caso, a função directory(), seria a mais aconselhada para isso, uma vez que torna possível a análise de vários atributos dos arquivos.

Resumidamente, qualquer arquivo .exe no seu path, você pode rodar com esta função.

Um exemplo de comando (que na verdade é um programa) seria este:

Código: Selecionar todos

// Teste.prg , lista os processos do Windows e guarda numa variavel
Function main()

 Local nResult := 0
 Local cCommand := "tasklist"
 Local cStdOut
 Local cStdErr
 
 nResult := hb_processRun( cCommand, , @cStdOut, @cStdErr, .t. )
  
 ? nResult
 ? cStdOut
 ? cStdErr

Return
CORRIGINDO:
Antigamente no clipper se você chamasse um programa via run por exemplo, você precisava jogar num arquivo texto para pegar o retorno. Algo tipo TASKLIST > arq.txt.
Usando a hb_processRun, você pode pegar o retorno de qualquer comando ( QUE SEJA UM programa) numa variável, e sem exibir ele na tela, o que facilita muito.
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Responder