Execução de comandos e programas externos

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

Moderador: Moderadores

Avatar do usuário
jorge andrade
Usuário Nível 1
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

Mensagem por jorge andrade »

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,
Jorge Andrade
TerraSoftware
Usuário Nível 3
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

Mensagem por TerraSoftware »

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.
www.sisterra.com.br
xHarbour 1.0.0 - Bcc 6.3 - Gtwvw/Hwgui
DbfCdx/MySql
Avatar do usuário
jorge andrade
Usuário Nível 1
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

Mensagem por jorge andrade »

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,
Jorge Andrade
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Execução de comandos e programas externos

Mensagem por Maligno »

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!
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:

Re: Execução de comandos e programas externos

Mensagem por clodoaldomonteiro »

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.
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
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Execução de comandos e programas externos

Mensagem por sygecom »

Ou pode usar também:

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.
ou:

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
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Execução de comandos e programas externos

Mensagem por lugab »

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
lugab
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Execução de comandos e programas externos

Mensagem por sygecom »

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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Execução de comandos e programas externos

Mensagem por lugab »

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()
lugab
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Execução de comandos e programas externos

Mensagem por lugab »

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
lugab
Avatar do usuário
rochinha
Administrador
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

Mensagem por rochinha »

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:

Código: Selecionar todos

...
   hIE := FindWindow( 0, "IEFrame" )
   lCaptured := ( hIE > 0 )
   IF lCaptured
      SetActiveWindow( hIE )
   ELSE
      MsgStop( "IE nao capturado. ative-o" )
   ENDIF 
...
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:

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 
...
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:

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 
...
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.
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.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Execução de comandos e programas externos

Mensagem por lugab »

Muito bem, Rochinha.

Agora , cabe experimentar tudo.

Grato,

gabriel
lugab
Responder