Compilar função em tempo de execução

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Compilar função em tempo de execução

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Compilar função em tempo de execução

Mensagem 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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilar função em tempo de execução

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Compilar função em tempo de execução

Mensagem 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...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilar função em tempo de execução

Mensagem por asimoes »

Alexandre,

O arquivo .hrb é compilado, não é o código fonte.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Compilar função em tempo de execução

Mensagem 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.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Compilar função em tempo de execução

Mensagem 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.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Compilar função em tempo de execução

Mensagem 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

Código: Selecionar todos

cProc += "? 'Apenas um Teste!'" + Hb_EoL()
por

Código: Selecionar todos

cProc += "FErase( 'Cliente.Dbf' )" + Hb_EoL()
demonstra o que quero dizer.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilar função em tempo de execução

Mensagem por asimoes »

Alexandre,

O Jairo postou a outra forma de utilização, claro que essa não é segura.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilar função em tempo de execução

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Compilar função em tempo de execução

Mensagem 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
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Compilar função em tempo de execução

Mensagem 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
Anexos
_demoHBR.rar
(2.56 MiB) Baixado 117 vezes
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Compilar função em tempo de execução

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Compilar função em tempo de execução

Mensagem 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?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Compilar função em tempo de execução

Mensagem por JoséQuintas »

Isso mesmo.

Lembrando que vai precisar dos arquivos CH, igual qualquer compilação.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder