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.