Página 1 de 2
Compilar função em tempo de execução
Enviado: 08 Abr 2016 09:46
por Jairo Maia
Não sei muito bem onde usaria isso, nem o potencial desse recurso, mas pesquisando outro assunto achei isso por acaso e parece
"loco":
Código: Selecionar todos
FUNCTION Main()
Local buf, cBuf, cProc
Private cMsg:="Funcao carregada do disco e;compilada em Tempo de Execucao"
cProc := "Procedure MM" + Hb_EoL()
cProc += "?" + Hb_EoL()
cProc += "? 'Apenas um Teste!'" + Hb_EoL()
cProc += "?" + Hb_EoL()
cProc += "Hb_Alert( cMsg )" + Hb_EoL()
Hb_MemoWrit( "ProcMM.Txt", cProc ) // salva a função em disco
cBuf := Hb_MemoRead( "ProcMM.Txt" ) // carrega a função do disco
buf := hb_compileFromBuf( cBuf, "harbour", "/n" ) // compila a função
hb_hrbRun( buf ) // executa a função
?
?
Return Nil
Fonte:
http://www.kresin.ru/en/hrbfaq_3.html
Compilar função em tempo de execução
Enviado: 08 Abr 2016 11:16
por Toledo
Só para complementar... estas funções são utilizadas no HBMK2 e no HBIDE para compilar os programas, veja a pasta \utils\hbmk2 do Harbour ou \qtcontribs\hbide.
Abraços,
Compilar função em tempo de execução
Enviado: 08 Abr 2016 15:37
por asimoes
Jairo,
A lib letodb utiliza este recurso.
Uma utilização prática, seria disponibilizar uma rotina para testes ou homologação fora da aplicação principal, o usuário aprovando, a rotina passa integrar a aplicação.
Como funcionaria, uma thread ficaria verificando se o arquivo hbscript.hrb está presente, se está, abre e executa.
Um exemplo:
Código: Selecionar todos
MyRun("\hb32fork\bin\harbour.exe @hbscript -q0 -n -gh -i:\hb32fork\include")
cConteudo:=MemoRead( "hbscript.hrb" )
HANDLE_HRB := hb_hrbload( cConteudo )
EVAL(HB_HRBGETFUNSYM( HANDLE_HRB, "PROG3" ))
Conteúdo de hbscript.clp
HBSCRIPT.PRG
HBSCRIPT2.PRG
HBSCRIPT.PRG
Código: Selecionar todos
FUNCTION PROG1(cMensagem)
LOCAL cTeste
HB_Default(@cMensagem,"")
hwg_MsgInfo(cMensagem)
RETURN Nil
HBSCRIPT2.PRG
Código: Selecionar todos
FUNCTION PROG3
LOCAL cTeste
CLS
PROG1("Chamando PROG1 de PROG3")
//hb_threadStart( { |oThr| PROG1("Chamando PROG1 de PROG3") } )
RETURN Nil
Um exemplo do LetoDb server.prg (função de usuário)
Código: Selecionar todos
STATIC FUNCTION leto_hrbLoad
LOCAL cHrbName := cDirBase + "letoudf.hrb", pInit
IF File( cHrbName )
pHrb := hb_HrbLoad(HB_HRB_BIND_DEFAULT, cHrbName )
IF ! Empty(pHrb)
WrLog( cHrbName + " has been loaded." )
IF ! Empty( pInit := hb_hrbGetFunSym(pHrb, 'UDF_Init') )
hb_ExecFromArray( pInit )
ENDIF
ENDIF
ENDIF
RETURN Nil
Função MyRun
Código: Selecionar todos
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
Compilar função em tempo de execução
Enviado: 08 Abr 2016 16:18
por alxsts
Olá!
É algo preocupante em relação ao quesito segurança.
Imaginem alguém mal intencionado alterando uma função armazenada em disco e colocando código para deletar todas as tabelas do sistema...
Compilar função em tempo de execução
Enviado: 08 Abr 2016 16:21
por asimoes
Alexandre,
O arquivo .hrb é compilado, não é o código fonte.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 16:22
por Claudio Soto
hb_CompileFromBuf() permite crear a partir de código fuente PRG archivos de ByteCode (.hrb) de Harbour que pueden ser cargados dinamicamente con hb_hrbLoad() y ejecutados por la MV de Harbour.
Los archivos .hrb vendrían a ser equivalentes a las librerias de ligación dinamica de Windows (.DLL)
Un unico archivo .hrb puede contener varias funciones/procedures que pueden ser llamadas por nuestra aplicación.
Los archivos de ByteCodes pueden ser utiles en aquellos SO que no soportan la ligación dinamica, es decir que todas las lib deben ser estáticas y por lo tanto tienen que ser linkadas en el momento de la compilación.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 16:36
por Claudio Soto
Otra utilidad sería hacer que nuestra aplicación funcione como si fuera un antivirus o un SO, con un motror (archivo .EXE) y un conjunto separado de definición de datos/funciones (archivos .hbr).
En el archivo .EXE ponemos las funciones basicas que no requieren gran mantenimiento y en los archivos .hbr las funciones/datos que requieren una actualización frecuente. Podriamos en un determinado momento actualizar una determinada función e instalar en el cliente solo el archivo .hbr correspondiente y de esta manera evitamos tener que reinstalar nuevamente toda nuestra aplicación.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 17:15
por alxsts
Olá!
asimoes escreveu:O arquivo .hrb é compilado, não é o código fonte.
Não é o que demonstra o código postado pelo Jairo, onde o código é carregado a partir de um Txt armazenado em disco.
Trocando a linha
por
demonstra o que quero dizer.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 19:38
por asimoes
Alexandre,
O Jairo postou a outra forma de utilização, claro que essa não é segura.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 19:42
por asimoes
Dr. Claudio,
Boa ideia!
Desta forma, o executável não precisa nem ser reiniciado, as atualizações seriam pontuais, ou em uma rotina especifica.
Compilar função em tempo de execução
Enviado: 08 Abr 2016 21:18
por fladimir
desculpem... parece ser interessante, mas de verdade... não entendi direito como tirar proveito disso... e disso o q? Do tipo do Jairo ou do tipo do Dr. Claudio? Nem sei direito...
Alguém teria outra explicação e/ou exemplo prático?
[]´s
Compilar função em tempo de execução
Enviado: 09 Abr 2016 01:00
por Claudio Soto
Aquí les dejo un demo con dos carpetas:
1) gen_lib: en esta carpeta a partir del archivo libPRG.prg se genera la libreria LibHRB.hrb que contiene 3 funciones llamadas Func1, Func2 y Func3.
2) use_lib: en esta carpeta se carga la libreria LibHRB.hrb y se llaman las funciones que la componen.
Nota: la aplicación que se le entregaría al cliente estaría compuesta solo por los archivos: use_lib_HRB.EXE y LibHRB.hrb
Compilar função em tempo de execução
Enviado: 09 Abr 2016 18:49
por JoséQuintas
Poderiam existir rotinas personalizadas gravadas em uma base MySQL.
É interesssante, mas...
Deve complicar o gerenciamento das rotinas, e até pra manter tudo compatível.
Compilar função em tempo de execução
Enviado: 10 Abr 2016 12:49
por fladimir
Ah sim... acho q entendi... tipo ToTvs (antigo microsiga)
da pra criar rotinas e chamar no sistema sem ter q recompilar..
Pegando o ganho do Quintas... podia ter uma tabela com as rotinas...
Ai no sistema posso criar um menu chamado rotinas personalizadas q lista as rotinas q tiver na tabela exemplo
Titulo Rotina.................
Relat Clientes Alfabetica ...
ai se chamo essa rotina ela executa... se quiser alterar posso criar dentro do sistema um editor de rotinas ou se for via arquivo externo TXT etc... edito no Bloco de Notas...
Seria mais ou menos isso?
Compilar função em tempo de execução
Enviado: 10 Abr 2016 21:21
por JoséQuintas
Isso mesmo.
Lembrando que vai precisar dos arquivos CH, igual qualquer compilação.