Página 1 de 1
Execução de comandos e programas externos
Enviado: 17 Dez 2009 12:20
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,
Re: Execução de comandos e programas externos
Enviado: 17 Dez 2009 13:46
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.
Re: Execução de comandos e programas externos
Enviado: 18 Dez 2009 12:23
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,
Re: Execução de comandos e programas externos
Enviado: 18 Dez 2009 12:29
por Maligno
Só uma correção: WinExec() é uma função da API do Windows e não de uma biblioteca qualquer do [x]Harbour.
Re: Execução de comandos e programas externos
Enviado: 03 Jan 2010 00:06
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.
Re: Execução de comandos e programas externos
Enviado: 31 Jan 2010 11:53
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.)
Re: Execução de comandos e programas externos
Enviado: 05 Fev 2010 23:33
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
Re: Execução de comandos e programas externos
Enviado: 08 Fev 2010 21:34
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
Re: Execução de comandos e programas externos
Enviado: 11 Fev 2010 18:07
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()
Re: Execução de comandos e programas externos
Enviado: 14 Fev 2010 05:49
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
Re: Execução de comandos e programas externos
Enviado: 16 Fev 2010 00:39
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.
Re: Execução de comandos e programas externos
Enviado: 16 Fev 2010 17:21
por lugab
Muito bem, Rochinha.
Agora , cabe experimentar tudo.
Grato,
gabriel