Página 1 de 1

Como chamar processo externo?

Enviado: 08 Dez 2011 17:05
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?

Como chamar processo externo?

Enviado: 08 Dez 2011 17:22
por Pablo César
Com o uso do RUN e o START do sistema operacional, não poderia servir ?

Como chamar processo externo?

Enviado: 08 Dez 2011 19:28
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.

Como chamar processo externo?

Enviado: 16 Dez 2011 20:27
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.

Como chamar processo externo?

Enviado: 16 Dez 2011 20:56
por Pablo César
Boa explicação Stanis. Obrigado a você e ao Itamar por compartilhar conosco. Eu não sabia, simplesmente fantástico !

Como chamar processo externo?

Enviado: 16 Dez 2011 21:56
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 ?

Como chamar processo externo?

Enviado: 17 Dez 2011 11:27
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.

Como chamar processo externo?

Enviado: 17 Dez 2011 22:37
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)



Como chamar processo externo?

Enviado: 20 Dez 2011 10:24
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.

Como chamar processo externo?

Enviado: 20 Dez 2011 19:33
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

Como chamar processo externo?

Enviado: 20 Dez 2011 22:18
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.