Como chamar processo externo?
Moderador: Moderadores
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
Como chamar processo externo?
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?
É 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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Como chamar processo externo?
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.
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.
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7929
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Como chamar processo externo?
Oi.
No Harbour tem.
Saudações,
Itamar M. Lins Jr.
No Harbour tem.
Esse tal lDetach, espera o retorno.* 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.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Como chamar processo externo?
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.
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.
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.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Como chamar processo externo?
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.
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.
Como chamar processo externo?
Pesssal,
Fiz ese pequeno teste e deu "ARGUMENT ERROR"
Alguém me orienta ?
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)
lugab
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Como chamar processo externo?
Provavelmente porquê você não está passando o paramentro por referência.lugab escreveu:Fiz ese pequeno teste e deu "ARGUMENT ERROR"
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
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.
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.
Como chamar processo externo?
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...
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

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Como chamar processo externo?
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:
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.
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
ReturnAbraç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.
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.
Como chamar processo externo?
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:
Gabriel
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

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Como chamar processo externo?
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:
CORRIGINDO:
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
ReturnAntigamente 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.
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.