Ir para o conteúdo

 Voltar a PW3270 Suporte
Tela cheia

Script Rexx: Como StandAlone ou Plugin?

9 de Dezembro de 2011, 10:18 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 205 vezes

Consegui criar Scripts Rexx funcionais que rodam como plugin, ou seja, através do menu <Scripts> / <Script Rexx Externo>.

Precisaria que eles fossem capazes de rodar como "standalone", ou seja, sem executar o pw3270, diretamente do interpretador OORexx, mas não consigo e não encontrei material para consulta.

E como faço para adicionar itens ao menu <Scripts> / <Scripts Rexx> e onde estes scripts devem estar salvos?

A plataforma é Windows.

 

Obrigado!


Autor: Euler Alves


1111 comentários

  • 1767f2494e710e7dbf3d58b83803462b?only path=false&size=50&d=404Euler Alves(usuário não autenticado)
    9 de Dezembro de 2011, 14:25

     

    Minha dúvida resume-se nisso.

    Quando executo o script pelo Rexx, fora do aplicativo, não consigo carregar as funções ou a classe (OORexx).

    Experimentei usar o script de exemplo daqui sem as funções de carregamento da API e descobri que funcionava perfeitamente quando executado pelo aplicativo PW.Ou seja, o aplicativo está carregando a API e fazendo a chamada ao Rexx.

    Qual é a forma correta de carregar as funções fora do aplicativo (direto no interpretador Rexx)?

     

    /* Carrega a API 3270 */
    /*call rxfuncadd 'rx3270LoadFuncs', 'rx3270', 'rx3270LoadFuncs'*/
    /*retc = rx3270LoadFuncs()*/
    say 'Return code from loading rx3270 functions was' retc

    /* Se estiver conectado desconecta */
    if rx3270QueryCState() <> "NOT_CONNECTED"
        then ok = rx3270Disconnect()

    /* Reconecta ao novo host, espera pela negociacao */
    ok = rx3270Connect("172.17.16.3:23",300)

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      9 de Dezembro de 2011, 16:11

       

      Olá,

      A única coisa que me chamou atenção no seu script foram os comentários nas linhas que chamam rxfuncadd() e rx3270loadfuncs(); essas duas chamadas são necessárias no modo standalone já que é através delas que a biblioteca é carregada.

      Quando você testou elas apresentaram algum erro?

      Quanto ao menu: Ele procura automaticamente por todos os arquivos com final .rex dentro da pasta "rexx" do diretório de instalação (ela não existe por default).

       

      • 1767f2494e710e7dbf3d58b83803462b?only path=false&size=50&d=404Euler Alves(usuário não autenticado)
        11 de Dezembro de 2011, 1:01

         

        Eu comentei estas linhas justamente para confirmar que elas são desnecessárias quando o script é executado dentro do PW.

        Mas com as linhas ativadas, ainda assim não consigo carregar a biblioteca PW através do Rexx. Não tenho prática com Rexx então certamente devo estar fazendo algo errado. É como se a chamada rxfuncadd não tivesse efeito ou não encontrasse rx3270.dll

        Tentei:

        estado=rxfuncadd('rx3270LoadFuncs', 'rx3270', 'rx3270LoadFuncs')

        estado=rxfuncadd('rx3270LoadFuncs', 'c:\Arquivos de programas\ALGUMcaminhoATEdll\rx3270', 'rx3270LoadFuncs')

        estado=rxfuncadd('rx3270LoadFuncs', 'AAAAAAA', 'rx3270LoadFuncs')

        E todas deram o mesmo resultado (se não me falha a memória, 1). E quando passa-se a linha seguinte, retc = rx3270LoadFuncs(),  o Rexx acusa o erro de função não encontrada (algo assim).

        Estou fazendo estas tentativas no Windows.

        Obrigado pela atenção! 

        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
          12 de Dezembro de 2011, 23:33

           

          Olá,

          Você mudou o caminha da DLL? Uso muito pouco o rexx no windows mas, pelo que me lembro, não adianta colocar o path completo do arquivo; a DLL tem que estar no path.

          rxfuncadd retorna diferente de zero sempre que a carga falhou por algum motivo.

           

          • 1767f2494e710e7dbf3d58b83803462b?only path=false&size=50&d=404Euler Alves(usuário não autenticado)
            14 de Dezembro de 2011, 22:38

             

            Tento agora trazer informações mais consistentes.

            O path está conforme esperado, a lib3270.dll existe em c:\windows\system32 e o script abaixo funciona quando acionado pelo pw, mas quando executado diretamente pelo Rexx, não carrega a rx3270 conforme os erros abaixo.

            VERSÕES 

            Rexx version: REXX-ooRexx_4.1.0(MT) 6.03 5 Dec 2010
            pw3270: Windows 4.2.4 1620

            PATH  

            C:\Arquivos de Programas\pw3270>echo %path%

            C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;;C:\Arquivos de Programas\web\NTP\bin;C:\Arquivos de Programas\ooRexx;C:\Arquivos de Programas\pw3270

            ERROS RUNTIME REXX

                 5 *-* retc = rx3270LoadFuncs()
            Error 43 running C:\Arquivos de Programas\pw3270\TESTE.rex line 5:  Routine not found
            Error 43.1:  Could not find routine "RX3270LOADFUNCS" 

                 5 *-* retc = rx3270LoadFuncs()
            Error 43 running C:\Arquivos de Programas\ooRexx\TESTE.rex line 5:  Routine not found
            Error 43.1:  Could not find routine "RX3270LOADFUNCS" 

            SCRIPT TENTADO 

            /* TESTE.rex */

            call rxfuncadd 'rx3270LoadFuncs', 'rx3270', 'rx3270LoadFuncs'

            retc = rx3270LoadFuncs()

            say 'Return code from loading rx3270 functions was' retc

            if rx3270QueryCState() <> "NOT_CONNECTED"

            then ok = rx3270Disconnect()

            ok = rx3270Connect("192.168.1.2:23",1)

            if rx3270QueryCState() = "NOT_CONNECTED" then do

            say "Não foi possível conectar ao host, cancelando"

            return 0

            end

             

            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
              30 de Janeiro de 2012, 22:50

               

              Olá,

              Desculpe a demora mas parece que as notificações por e-mail pararam na mudança do site.

              Tente fazer uma mudança no script para ver se dá algum resultado:

              Onde está: 

               call rxfuncadd 'rx3270LoadFuncs', 'rx3270', 'rx3270LoadFuncs'

              Troque por: 

              say "rxfuncadd saiu com "||rxfuncadd('rx3270loadfuncs','rx3270','rx3270loadfuncs')
              say "Query: "||rxfuncquery('rx3270loadfuncs') 

               

              • 1767f2494e710e7dbf3d58b83803462b?only path=false&size=50&d=404Euler Alves(usuário não autenticado)
                4 de Fevereiro de 2012, 11:38

                 

                Tentei:

                say "rxfuncadd: "||rxfuncadd('rx3270LoadFuncs','rx3270','rx3270LoadFuncs')
                say "rx3270LoadFuncs: "||rxfuncquery('rx3270LoadFuncs')
                say "rx3270Connect: "||rxfuncquery('rx3270Connect')
                say "abobrinha: "||rxfuncadd('qualquercoisa','abobrinha','coisanenhuma')

                com ooRexx: 4.1.0 build 2010-12-05 e pw3270 4.2#1429

                rxfuncadd: 1
                rx3270loadfuncs: 0
                rx3270Connect: 1
                abobrinha: 1

                com Regina: 3.6 build 2011-12-31 e pw3270 4.2#1429

                rxfuncadd: 50
                rx3270loadfuncs: 1
                rx3270Connect: 1
                abobrinha: 40

                O que concluo que ooRexx tem um bug fatal no rxfuncadd. Mas ainda assim mesmo o Regina não encontra rxloadfuncs

                 

                 

                 

                 

  • 1767f2494e710e7dbf3d58b83803462b?only path=false&size=50&d=404Euler Alves(usuário não autenticado)
    4 de Fevereiro de 2012, 13:17

     

    Resolvi tentar com o pw3270 4.0.2 e funcionou para cada Função mas não para o LoadFuncs 

    say "abobrinha: "||rxfuncadd('qualquercoisa','abobrinha','coisanenhuma')
    say "rxfuncadd LoadFuncs: "||rxfuncadd('rx3270Loadfuncs','rx3270','rx3270loadfuncs')
    say "loadfuncs: "||rxfuncquery('rx3270loadfuncs')
    say "rx3270InputString: "||rxfuncquery('rx3270InputString')
    say "rxfuncadd rx3270InputString: "||rxfuncadd('rx3270InputString','rx3270','rx3270InputString')
    say "rx3270InputString: "||rxfuncquery('rx3270InputString')
    say "rxfuncadd rx3270QueryCState: "||rxfuncadd('rx3270QueryCState','rx3270','rx3270QueryCState')
    say "rx3270QueryCState: "||rxfuncquery('rx3270QueryCState')
    say "Estado: "||rx3270QueryCState()

    pw 4.0.2 com Regina

    abobrinha: 40
    rxfuncadd LoadFuncs: 50
    loadfuncs: 1
    rx3270InputString: 1
    rxfuncadd rx3270InputString: 0
    rx3270InputString: 0
    rxfuncadd rx3270QueryCState: 0
    rx3270QueryCState: 0
    Estado: NOT_CONNECTED

     pw 4.0.2 com ooRexx

    abobrinha: 1
    rxfuncadd LoadFuncs: 1
    loadfuncs: 0
    rx3270InputString: 0
    rxfuncadd rx3270InputString: 0
    rx3270InputString: 0
    rxfuncadd rx3270QueryCState: 0
    rx3270QueryCState: 0
    Estado: NOT_CONNECTED

    pw 4.2.0 ou 4.2.4 com Regina

    abobrinha: 40
    rxfuncadd LoadFuncs: 50
    loadfuncs: 1
    rx3270InputString: 1
    rxfuncadd rx3270InputString: 50
    rx3270InputString: 1
    rxfuncadd rx3270QueryCState: 50
    rx3270QueryCState: 1
    'RX3270QUERYCSTATE' is not recognized as an internal or external command,operable program or batch file.
    Estado:

     

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      4 de Fevereiro de 2012, 14:25

       

      Olá,

      Alguns comentários:

      Existe mais de uma cópia do arquivo librx3270.dll? Em que diretório está instalado (o instalador padrão hoje coloca no diretório do rexx mas depois dessa conversa ando pensando em colocar no diretório de bibliotecas do windows; mais fácil para o sistema achar e carregar).

      Uma diferença entre as versões mais antigas e as novas é que os módulos rexx standalone e plugin tem "checkboxes" separados durante a instalação, ou seja, dependendo do que foi selecionado ele pode instalar só o plugin. Foi alterado para ficar mais semelhante à versão linux que instala os módulos individualmente.

      Nunca usei o regina rexx no windows mas, nos poucos testes que foram feitos em linux as extensões não funcionaram muito bem. Não cheguei a pesquisar a fundo para identificar o porque.
      Devido a algumas características do ambiente BB o aplicativo era desenvolvido e testado usando o ooRexx 3; só recentemente que passei a usar ooRexx 4 e, após a mudança, notei (em outro projeto) que as extensões rexx não estão 100%; aparentemente devido ao serviço rxapi (que não existia nas versões antigas). Você tem como testar a rxloadfuncs executando um "net stop rxapi" e "net start rxapi" para ver se o comportamento melhora?

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      13 de Fevereiro de 2012, 7:41

       

      Olá,

      Esbarrei no mesmo problema em outro projeto! Pareçe que algo foi mudado no rexx 4.1.0 e a função rxloadfuncs não funciona mais como antes. Vou precisar olhar isso com um pouco mais de calma; talvez seja o empurrão que faltava para passar a usar a API baseada em classes do ooRexx e largar de vez a versão antiga.

       

    • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
      14 de Março de 2012, 11:09

       

      Olá,

      Encontrei o problema: O mecanismo de carga de extensões mudou um pouco na versão mais recente do rexx. Vou precisar mudar bastante o processo.

Essa comunidade não possui posts nesse blog