Execução de comandos e programas externos
Moderador: Moderadores
- jorge andrade
- Usuário Nível 1

- Mensagens: 38
- Registrado em: 02 Dez 2009 13:28
- Localização: são paulo
Execução de comandos e programas externos
Boa tarde pessoal
Depois de resolvido o problema da compilação linkedição com o harbour 1.01, me surgiu outro problema, eu usava o um BLINKER para linkeditar e nele usava o SWPRUNCMD() para executar conforme o assunto acima, porém este deu erro na compilação, mesmo eu informando a LIB na pasta do harbour e do BCC55, tem alguma LIB que tenha outra função que eu possa utilizar?
[]s,
Depois de resolvido o problema da compilação linkedição com o harbour 1.01, me surgiu outro problema, eu usava o um BLINKER para linkeditar e nele usava o SWPRUNCMD() para executar conforme o assunto acima, porém este deu erro na compilação, mesmo eu informando a LIB na pasta do harbour e do BCC55, tem alguma LIB que tenha outra função que eu possa utilizar?
[]s,
Jorge Andrade
-
TerraSoftware
- Usuário Nível 3

- Mensagens: 353
- Registrado em: 28 Jul 2004 13:14
- Localização: Cianorte-PR
- Contato:
Re: Execução de comandos e programas externos
Caro colega, eu uso no xharbour winexec("c:\windows\explorer.exe")
É uma funcao nativa da HWGUI, mas existe o fonte dela em C puro, aqui mesmo neste forum vc consegue ela.
É uma funcao nativa da HWGUI, mas existe o fonte dela em C puro, aqui mesmo neste forum vc consegue ela.
- jorge andrade
- Usuário Nível 1

- Mensagens: 38
- Registrado em: 02 Dez 2009 13:28
- Localização: são paulo
Re: Execução de comandos e programas externos
Eu não estou usando nenhuma lib do hwgui, alías eu ainda não entendi, qual a diferença destas lib's, hwgui, minigui e etc, elas tem apenas recursos para visuais ou são necessárias para que determinados recursos do windows possam ser aplicados no sistema?
Se alguém souber de algum material que possa descrever estas lib's e suas funcções, ficaria muito grato, pois quem inicia sempre está há 20 mil léguas atrás.
[]s,
Se alguém souber de algum material que possa descrever estas lib's e suas funcções, ficaria muito grato, pois quem inicia sempre está há 20 mil léguas atrás.
[]s,
Jorge Andrade
Re: Execução de comandos e programas externos
Só uma correção: WinExec() é uma função da API do Windows e não de uma biblioteca qualquer do [x]Harbour.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
Re: Execução de comandos e programas externos
Você pode usar também a função: HB_OpenProcess("Comando",,,,.t.) //xhb.lib
Se quiser pode pegar detalhes dela no "xHarbour Language Reference Guide" da versão comercial.
Foi a mais completa que achei.
Se quiser pode pegar detalhes dela no "xHarbour Language Reference Guide" da versão comercial.
Foi a mais completa que achei.
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
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Execução de comandos e programas externos
Ou pode usar também:
ou:
Código: Selecionar todos
**************************
Function MYRUN( cComando )
**************************
local oShell
TRY
oShell := CreateObject( "WScript.Shell" )
CATCH
TRY
oShell := CreateObject( "WScript.Shell" )
CATCH
MsgStop( "Erro! ao executar um comando externo","Aviso do Sistema")
RETURN(.F.)
END
END
TRY
oShell:Run( "%comspec% /c " + cComando, 0, .T. )
CATCH
winexec(cComando,2)
END
oShell := NIL
return .T.
Código: Selecionar todos
***********************
FUNCTION MyRun2( cRun )
***********************
Local hIn, hOut, nRet //, hProc
Local hProc := HB_OpenProcess( cRun , @hIn, @hOut, @hOut )
IF hProc < 0
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return(.F.)
* msginfo("Error: " + valtoprg(FError()))
ENDIF
nRet := HB_ProcessValue( hProc,.f. )
IF nRet > 0
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return(.F.)
endif
FClose( hProc )
FClose( hIn )
FClose( hOut )
Return(.T.)
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
Re: Execução de comandos e programas externos
Olá, Sygecom e amigos do fórum.
Estou usando o Myrun2("c:\windows\system32\calc.exe"), postado acima pelo Sygecom.
Ao clicar na opção do menu, ele carrega a calculadora e a encerra, deixando na tela a imagem do carregamento anterior.
Se eu usar RUN c:\windows\system32\calc.exe Funciona direito, PORÉM ABRE A TELA PRETA FAMOSA DO DOS, ATRÁS.
Percebi que usando o Myrun2 , o programa chama a calculador e a encerra em seguidam antes de qq clique meu.
O que eu vejo na tela é apenas a imagem da calculadora antes de encerrar e ao clicar em cima, o programa interpreta que eu estou clicando na opção do menu de novo, e por isso carrega de novo a calculadora.
Uso o xharbour 1.00 + gtwvw + wvwtools.
Vcs tem alguma sugestão, para q a calculadora carregue funcione a contento dentro do meu sistemas ?
Grato,
Gabriel
Estou usando o Myrun2("c:\windows\system32\calc.exe"), postado acima pelo Sygecom.
Ao clicar na opção do menu, ele carrega a calculadora e a encerra, deixando na tela a imagem do carregamento anterior.
Se eu usar RUN c:\windows\system32\calc.exe Funciona direito, PORÉM ABRE A TELA PRETA FAMOSA DO DOS, ATRÁS.
Percebi que usando o Myrun2 , o programa chama a calculador e a encerra em seguidam antes de qq clique meu.
O que eu vejo na tela é apenas a imagem da calculadora antes de encerrar e ao clicar em cima, o programa interpreta que eu estou clicando na opção do menu de novo, e por isso carrega de novo a calculadora.
Uso o xharbour 1.00 + gtwvw + wvwtools.
Vcs tem alguma sugestão, para q a calculadora carregue funcione a contento dentro do meu sistemas ?
Grato,
Gabriel
lugab
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Execução de comandos e programas externos
No caso do MYRUN2() serve para executar o EXE sem trancar o processamento do seu aplicativo, imagine ter um exe que envia varios e-mails, usando ele chama uma vez e seu aplicativo fica liberado para o usuario continuar trabalhando sem ter que esperar aquele monte de envio de e-mail, para o que você quer o Ideal é usar:
ShellExecute("calc")
Para usar pode linkar a LIB da Hwgui junto ao seu projeto que funciona, ou se não me falha a memoria a what32.lib
ShellExecute("calc")
Para usar pode linkar a LIB da Hwgui junto ao seu projeto que funciona, ou se não me falha a memoria a what32.lib
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
Re: Execução de comandos e programas externos
Obrigado, Sygecom
O problema é este mesmo. Ele executa o aplicativo , mas não o tranca, o que retira o foco do aplicativo chamado..
Vou experimentar o shellexecute()
O problema é este mesmo. Ele executa o aplicativo , mas não o tranca, o que retira o foco do aplicativo chamado..
Vou experimentar o shellexecute()
lugab
Re: Execução de comandos e programas externos
Sygecom, o ShellExecute() também não segura a execucão da calculadora.
Ele até que carrega o calc.exe , mas retorna imediatamente o foco pro menu e mesmo que eu clique dentro da calculadora que foi carregada, outra cópia dela será gerada, pois o foco voltou pro menu e ficou na última opção clicada..
Coloquei um inkey(0) logo depois da chamada do shellexecute() e ai ele deixa trabalhar na calculadora, porém, mas depois que eu a fecho, o sistema fica aguardando a tecla do inkey() e parece q está travado ou em algum loop.
Linkei com a hwgui.lib no programa e coloquei ShellExecute("c:\windows\system32\calc.exe")
Vc Tem mais alguma sugestão , pra prender o foco no executável chamado ?
Obrigado
Ele até que carrega o calc.exe , mas retorna imediatamente o foco pro menu e mesmo que eu clique dentro da calculadora que foi carregada, outra cópia dela será gerada, pois o foco voltou pro menu e ficou na última opção clicada..
Coloquei um inkey(0) logo depois da chamada do shellexecute() e ai ele deixa trabalhar na calculadora, porém, mas depois que eu a fecho, o sistema fica aguardando a tecla do inkey() e parece q está travado ou em algum loop.
Linkei com a hwgui.lib no programa e coloquei ShellExecute("c:\windows\system32\calc.exe")
Vc Tem mais alguma sugestão , pra prender o foco no executável chamado ?
Obrigado
lugab
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Execução de comandos e programas externos
Amiguinhos,
As funções WinEXEC() e ShellExecute() fazem o seu papel de apenas dar suporte a execução de aplicações externas e nada mais de interação.
Para uma interação mais elaborada é necessário aprofundar-se no uso da API do Windows e descobrir mais funções uteis.
dentre elas encontramos as que nos interessam neste momento:
FindWindow()
SetActiveWindow()
FindWindow() - irá pesquisar dentre as janelas abertas qual é aquela que procuramos, exemplo:
FindWindow( "IEFrame" ) irá encontrar e trazer o handle da janela do Internet Explorer.
SetActiveWindow() - Irá ativar a janela que queremos, através de seu handle, e torná-la ativa a frente de todas.
Neste pequeno trecho temos a captura e ativação da janela de um aplicativo:
Para o caso de termos de verificar se o aplicativo esta ativo ou não e então ativá-lo é que devemos melhorar o código:
Outra possibilidade é poder abrir um aplicativo e ao invés do mesmo funcionar em outra janela, funcionar dentro de uma janela filha de nosso aplicativo. Neste caso usa-se o código de pesquisa e acrescenta-se uma função de fixação:
Neste trecho podemos ver que a função SetParent() necessita de mais um handle, que é o da janela mãe pode SetParent() irá tornar o aplicativo sendo manipulado como uma Child/Filha da mesma.
A partir dai, só a imaginação é que diz quando parar.
As funções WinEXEC() e ShellExecute() fazem o seu papel de apenas dar suporte a execução de aplicações externas e nada mais de interação.
Para uma interação mais elaborada é necessário aprofundar-se no uso da API do Windows e descobrir mais funções uteis.
dentre elas encontramos as que nos interessam neste momento:
FindWindow()
SetActiveWindow()
FindWindow() - irá pesquisar dentre as janelas abertas qual é aquela que procuramos, exemplo:
FindWindow( "IEFrame" ) irá encontrar e trazer o handle da janela do Internet Explorer.
SetActiveWindow() - Irá ativar a janela que queremos, através de seu handle, e torná-la ativa a frente de todas.
Neste pequeno trecho temos a captura e ativação da janela de um aplicativo:
Código: Selecionar todos
...
hIE := FindWindow( 0, "IEFrame" )
lCaptured := ( hIE > 0 )
IF lCaptured
SetActiveWindow( hIE )
ELSE
MsgStop( "IE nao capturado. ative-o" )
ENDIF
...
Código: Selecionar todos
...
hCalc := FindWindow( 0, "Calc" )
lCaptured := ( hCalc > 0 )
IF lCaptured
SetActiveWindow( hCalc )
ELSE
WinExec( "c:\windows\system32\calc.exe" )
... // Aqui poderiamos usar a recursividada para refazer a pesquisa da janela e ativá-la
ENDIF
...
Código: Selecionar todos
...
hCalc := FindWindow( 0, "Calc" )
lCaptured := ( hCalc > 0 )
IF lCaptured
SetActiveWindow( hCalc )
SetParent( hCalc, oWin:hWnd )
ELSE
WinExec( "c:\windows\system32\calc.exe" )
... // Aqui poderiamos usar a recursividada para refazer a pesquisa da janela e ativá-la
ENDIF
...
A partir dai, só a imaginação é que diz quando parar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Re: Execução de comandos e programas externos
Muito bem, Rochinha.
Agora , cabe experimentar tudo.
Grato,
gabriel
Agora , cabe experimentar tudo.
Grato,
gabriel
lugab

