Página 1 de 3

Função WaitRUN para Harbour

Enviado: 06 Mar 2012 14:12
por Jairo Maia
Colegas do fórum,

Após vários meses afastado do fórum (e das atividades), estou com vagar retomando minha rotina, e espero breve poder também ajudar quando possível.

Estou dando continuidade na migração de um sistema usando Harbour 3.0, e gostaria de saber em qual lib posso encontrar a função WAITRUN().

Procurando pela solução que preciso, encontrei neste fórum este tópico: https://pctoledo.org/forum/viewto ... it=waitrun

Nele, o colega Itamar disse haver esta função em outras libs além do FIVEWIN, inclusive para Harbour, mas não disse qual seria esta lib. Gostaria de saber se algum colega sabe qual lib em harbour posso encontrá-la.

Agradeço qualquer dica.

Função WaitRUN para Harbour

Enviado: 07 Mar 2012 11:05
por Itamar M. Lins Jr.
Ola!
* 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.
Outra função para abrir html,etc...

Código: Selecionar todos

****************************
Function mRun(cComando,lFlag)
****************************
*
*
Local oShell,lRet
lFlag := if( lFlag = NIL, .F., lFlag )

oShell:=Win_OleCreateObject("WScript.Shell")
lRet  :=oShell:Run("%ComSpec% /c " + cComando, 0, lFlag)
oShell:=Nil

Return iif(lRet=0,.t.,.f.)
Saudações,
Itamar M. Lins Jr.

Função WaitRUN para Harbour

Enviado: 07 Mar 2012 14:01
por Jairo Maia
Olá Itamar,

Obrigado por sua resposta.

A função hb_processRun() não consegui usar. O comando é executado, mas aparece a janela preta do DOS, e não fica legal. Pesquisei para entender os parâmetros, e não encontrei.

A segunda função que vc passou, é idêntica a que o Leonardo havia postado no link que citei, e que eu não havia conseguido sucesso antes. Ocorre que hoje, após sua postagem, resolvi insistir, e com uma pequena modificação na minha função TUDO funcionou CORRETAMENTE, incluido retorno de erro (que provoquei), e emitir a mensagem de insucesso.

Obrigado a todos,
Problema Resolvido!

Função WaitRUN para Harbour

Enviado: 11 Mar 2012 14:46
por Thon Melo
Aproveitando o tópico gostaria de saber como faço para converter os comandos abaixo para Harbour

Código: Selecionar todos

!copy CDPABX.LOG+CDPABX.LXX CDPABX.LOG >NUL
!del CDPABX.LXX >NUL
no Clipper funcionava beleza depois que converti par harbour em modo console não funciona mais. Uso esse comando para manter um arquivo de log sempre atualizado. A cada execução coleto os dados de um PABX via porta serial e coloco em um arquivo temporário cdpabx.lxx depois pegava o arquivo de log antigo e acrescentava o arquivo novo ao final dele e depois apagava o arquivo temporário. alguém pode me dar uma idéia de como fazer isso com o harbour? Já tentei com waitRun() e com MYRUN() mas não dar certo apresenta um erro e o programa fecha não dar para ler qual é o erro.
Obrigado

Thon Melo

Função WaitRUN para Harbour

Enviado: 12 Mar 2012 08:44
por asimoes
Tente isso:
MyRun("CDPABX.LOG+CDPABX.LXX CDPABX.LOG")

FErase("CDPABX.LXX")

Ou

MyRun("DEL CDPABX.LXX")

Código: Selecionar todos

#include "hbcompat.ch"
FUNCTION MYRUN( cComando )
LOCAL oShell, lOk:=.T.
   TRY
      oShell:=CreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=CreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, .T. )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk

Função WaitRUN para Harbour

Enviado: 12 Mar 2012 10:55
por Thon Melo
Obrigado asimoes
Deu certo só acrescentei assim:

MyRun("copy CDPABX.LOG+CDPABX.LXX CDPABX.LOG >NUL")
DELETE FILE("CDPABX.LXX")

Uma das mensagem de erro que aparecia era que o arquivo esta sendo utilizado por outro processo. Percebi que não tinha fechado o arquivo com o comando SET PRINTER TO.

Valeu ...

Função WaitRUN para Harbour

Enviado: 12 Mar 2012 16:54
por asimoes
Ih, esqueci do COPY, ainda bem que funcionou.

Função WaitRUN para Harbour

Enviado: 25 Mai 2012 22:50
por Abel
Ola, Jairo Maia,

tentei usar a funcao myrun() para executar programas externos eliminando a tela preta que "pisca", mas ainda nao consegui.

no meu caso da erro de compilacao,

undefined reference to hb_fun_createobject, será que tenho q incluir alguma lib ?
quais #includes vc esta usando, vale dizer que estou usando harbour 3.1

Abracos,
ABEL

Função WaitRUN para Harbour

Enviado: 25 Mai 2012 23:46
por sygecom
viewtopic.php?f=4&t=13108

Função WaitRUN para Harbour

Enviado: 26 Mai 2012 15:31
por Abel
funcionou acrescentando na compilacao

-lxhb
-lhbwin

function myrun()

agora nao pisca mais a tela preta.

Abracos e valeu pelas dicas ...
Abel

Função WaitRUN para Harbour

Enviado: 02 Jun 2012 16:46
por Abel
Ola pessoal,

apos conseguir utilizar o comando myrun e evitar a tela preta e piscava com a ajuda de voces, preciso novamente de mais um empurranzinho, quando a execucao de programas externos pelo harbour.

tenho em uma das minhas rotinas o seguinte:

MYRUN("ARJ.EXE A -VA -R BACKUP *.DBF *.MEM *.TXT")

O que ocorre é que ao executar este comando utilizando o myrun, ele nao exibe o andamento da compactacao para
que o cliente veja alguma mensagem de erro., vale dizer que ele executa perfeitamente o comando mas eu nao
vejo o andamamento.

seria possivel executar um programa externo msdos e ver o andamento, uma vez que estou compilando com os parametros -GUI e meu sistema era modo console totalmente procedural ?

Agradeco antecipadamente...
ABEL

Função WaitRUN para Harbour

Enviado: 02 Jun 2012 18:10
por Imatech
.
Para esse caso: voltar ao: HB_RUN ( sCMD )
.

Código: Selecionar todos


sCMD := "ARJ.EXE A -VA -R BACKUP *.DBF *.MEM *.TXT"

HB_RUN ( sCMD )


Função WaitRUN para Harbour

Enviado: 04 Jun 2012 22:49
por Abel
jovemxxx,
me diz uma coisa, usei o hb_run e rodou perfeitamente (arj), mas abriu uma outra janela msdos executou e depois fechou.

é assim mesmo ? na janela do meu sistema q agora esta compilado com -gui nao tem como apresentar o andamento da compactacao ?

Abracos,
ABEL

Função WaitRUN para Harbour

Enviado: 04 Jun 2012 23:24
por Pablo César
Abel você pode usar a função do Harbou HB_ZipFileCreate nela tem um parâmetro que você coloca o nome da função que serve para controlar o andamento do zipar e unzipar. Eu não encontrei exemplo em modo console para te mostrar, mas aqui tem um em Minigui que você pode adaptar:

Código: Selecionar todos

#command COMPRESS [ FILES ] <afiles> ;
		TO <zipfile> ;
		BLOCK <block>  ;
		[ <ovr: OVERWRITE> ] ;
		[ <srp: STOREPATH> ] ;
		[ PASSWORD <password> ] ;
=> ;
	COMPRESSFILES ( <zipfile> , <afiles>, <block> , <.ovr.> , <.srp.> , <password> )

Function Main
// chama as funções para zipar e unzipar
Return Nil


#command UNCOMPRESS [ FILE ] <zipfile> ;
		[ BLOCK <block> ] ;
		[ PASSWORD <password> ] ;
=> ;
	UNCOMPRESSFILES ( <zipfile> , <block> , <password> )


*------------------------------------------------------------------------------*
Function CreateZip()
*------------------------------------------------------------------------------*
Local aDir := Directory( "f*.txt", "D" ), aFiles:= {}, nLen
Local cPath := CurDrive()+":\"+CurDir()+"\"

FillFiles( aFiles, aDir, cPath )

if ( nLen := Len(aFiles) ) > 0
	Form_1.ProgressBar_1.RangeMin := 1
	Form_1.ProgressBar_1.RangeMax := nLen
	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,0}

	COMPRESS aFiles ;
		TO 'ZipTest.Zip' ;
		BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ;
		PASSWORD "mypass" ;
		OVERWRITE

	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,255}
	Form_1.Label_1.Value := 'Backup is finished'
endif

Return Nil

*------------------------------------------------------------------------------*
Function ProgressUpdate( nPos , cFile , lShowFileName )
*------------------------------------------------------------------------------*

	Default lShowFileName := .F.

	Form_1.ProgressBar_1.Value := nPos
	Form_1.Label_1.Value := cFileNoPath( cFile )

	if lShowFileName
		INKEY(.2)
	endif

Return Nil

*------------------------------------------------------------------------------*
Function UnZip()
*------------------------------------------------------------------------------*
Local cCurDir := GetCurrentFolder(), cArchive

cArchive := Getfile ( { {'Zip Files','*.ZIP'} } , 'Open File' , cCurDir , .f. , .t. )

if !Empty(cArchive)
	Form_1.ProgressBar_1.RangeMin := 0
	Form_1.ProgressBar_1.RangeMax := GetFilesCountInZip( cArchive )
	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,0}

	UNCOMPRESS cArchive ;
		BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ;
		PASSWORD "mypass"

	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,255}
	Form_1.Label_1.Value := 'Restoration of Backup is finished'
endif

Return Nil

*------------------------------------------------------------------------------*
Function FillFiles( aFiles, cDir, cPath )
*------------------------------------------------------------------------------*
  Local aSubDir, cItem

  FOR cItem :=1 TO LEN(cDir)
    IF cDir[cItem][5] <> "D"
      AADD( aFiles, cPath+cDir[cItem][1] )
    ELSEIF cDir[cItem][1] <> "." .AND. cDir[cItem][1] <> ".."
      aSubDir := DIRECTORY( cPath+cDir[cItem][1]+"\*.*", "D" )
      aFiles:=FillFiles( aFiles, aSubdir, cPath+cDir[cItem][1]+"\" )
    ENDIF
  NEXT

Return aFiles

*------------------------------------------------------------------------------*
Function GETFILESCOUNTINZIP ( cFileName )
*------------------------------------------------------------------------------*
LOCAL i := 0 , hUnzip , nErr

	hUnzip := HB_UNZIPOPEN( cFileName )

	nErr := HB_UNZIPFILEFIRST( hUnzip )

	DO WHILE nErr == 0

		i++
		nErr := HB_UNZIPFILENEXT( hUnzip )

	ENDDO

	HB_UNZIPCLOSE( hUnzip )

Return i

*------------------------------------------------------------------------------*
PROCEDURE COMPRESSFILES ( cFileName , aDir , bBlock , lOvr , lStorePath , cPassword )
*------------------------------------------------------------------------------*
LOCAL hZip , cZipFile , i

	if valtype (lOvr) == 'L'
		if lOvr == .t.
			if file (cFileName)
				delete file (cFileName)
			endif
		endif
	endif

	hZip := HB_ZIPOPEN( cFileName )
	IF ! EMPTY( hZip )
		FOR i := 1 To Len (aDir)
			if valtype (bBlock) == 'B'
				Eval ( bBlock , aDir [i] , i )     
			endif
			cZipFile := if( lStorePath, aDir [i], cFileNoPath( aDir [i] ) )
			HB_ZipStoreFile( hZip, aDir [i], cZipFile, cPassword )
		NEXT
	ENDIF

	HB_ZIPCLOSE( hZip )

RETURN

*------------------------------------------------------------------------------*
PROCEDURE UNCOMPRESSFILES ( cFileName , bBlock , cPassword )
*------------------------------------------------------------------------------*
LOCAL i := 0 , hUnzip , nErr, cFile, dDate, cTime, nSize, nCompSize, lCrypted, cComment

	hUnzip := HB_UNZIPOPEN( cFileName )

	nErr := HB_UNZIPFILEFIRST( hUnzip )

	DO WHILE nErr == 0

		HB_UnzipFileInfo( hUnzip, @cFile, @dDate, @cTime,,,, @nSize, @nCompSize, @lCrypted, @cComment )

		if valtype (bBlock) == 'B'
			Eval ( bBlock , cFile , ++i )
		endif

		HB_UnzipExtractCurrentFile( hUnzip, NIL, cPassword )

		nErr := HB_UNZIPFILENEXT( hUnzip )

	ENDDO

	HB_UNZIPCLOSE( hUnzip )

RETURN
O exemplo completo em GUI você pode ver em: C:\MiniGUI\SAMPLES\BASIC\Zip_3\demo.prg

Função WaitRUN para Harbour

Enviado: 05 Jun 2012 21:22
por Abel
valeu, vou dar uma pesquisada nisso,
ja que estou fazendo uma faxina no meu sistema, decidi fazer por completo..rs

Abracos, e desde ja agradeco mais uma vez.