Ir para o conteúdo

 Voltar a PW3270 Desen...
Tela cheia

Acesso às informações da sessão de terminal 3270

22 de Janeiro de 2010, 11:02 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 1448 vezes

Olá,

        Gostaria de saber se o PW3270 fornece informações das sessões 3270 abertas (nome de LU, IP do servidor, etc.) no Windows XP via linha de comando, ou algum arquivo, registro, etc. O que estou implementando é um "controlador" de sessões 3270 que possa obter informações sobre o host e a LU e permita conexão à LU de impressora correspondente.

 

     Grato

    

Autor: Eduardo Bisogno Andrade


6565 comentários

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

     

    Via linha de comando ou registro até o momento não, porém, essas informações podem ser passadas para um plugin. Você está implementando esse controlador em qual linguagem?

     

    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
      22 de Janeiro de 2010, 16:10

       

      Olá,

       

            Pretendo utilizar Visual Basic para essa parte da implementação (controle e GUIs) .

       

            Grato

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

         

        Olá,

         VB não é bem a minha área de conhecimento mas posso fazer um plugin que salve as informações que você precisa direto no registry ou, se preferir, que responda através de um named pipe. A segunda opção pode até ser mais interessante no futuro já que com algum trabalho extra pode permitir que outras aplicações tenham interação com o terminal.

        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
          25 de Janeiro de 2010, 11:31

           

          Olá,

           

             Pergunto se é possível então "ativar"  a função de trace  (-trace) do x3270 original (que salvava o tráfego num arquivo x3270.****.trace ou algo assim) no pw3270. Analisando a  negociação da sessão é possível determinar tipo de terminal, nome de LU, etc.

           

               Grato

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

             

            Olá,

            A opção ainda está lá mas, para ser sincero, não cheguei a testar se ficou funcional. A idéia do named-pipe não resolveria?

            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
              25 de Janeiro de 2010, 15:21

               

              Olá,

               

                 O named pipe pode resolver. Mas gostaria de utilizar o trace para já poder testar as funcionalidades do controlador "ao vivo", pois também é possível (na maioria dos casos) determinar o nome da LU através da análise dos dados do trace.

                Problema acontece quando tento ativar pw3270.exe com opção -trace e recebo a mensagem de "opção não reconhecida".

               

                    Grato

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

                 

                Olá,

                A opção correta seria --tracefile= só que testei aqui e o arquivo foi criado sem conteúdo. Provavelmente porque a maior parte das chamadas do código original já foi substituida. Quanto ao plugin usando named pipe: Me dê alguns dias que boto uma versão prévia para funcionar só informando dados do servidor e LU.

                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                  26 de Janeiro de 2010, 10:41

                   

                  Olá,

                   

                     Ainda sobre o arquivo de trace, pergunto se não é necessário especificar a opção -trace em conjunto com a opção --tracefile para que o arquivo seja gravado. De qualquer maneira, a opção -trace (ou --trace) não é reconhecida no Windows XP.

                   

                   

                     Grato

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

                 

                Olá,

                Se ajuda o plugin para named pipe já está funcional. Implementei o comando "status" que devolve a situação da conexão, nome da lu e nome do host. Por favor, confirme se isso atende.

                 Um teste pela linha de comando do windows...

                H:\Project\3270\v4>bin\Debug\pipetest.exe
                query("status"): "CONNECTED_TN3270E T2ZABFPN 3270.intranet"

                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                  26 de Janeiro de 2010, 15:20

                   

                  Olá

                   

                      Essa ferramenta (plugin) resolveria o problema. Se possível, peço-lhe que disponibilize junto com a ferramenta o "manual" para acessá-la.

                   

                      Grato

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

                     

                    Olá,

                    Acabo de subir para a área de arquivos uma prévia windows da versão 4.1 que inclui o plugin para uso de named-pipe; alguns detalhes...

                    O plugin de pipes não é instalado por default, isto é, você precisa marcar a opção correspondente durante a instalação (plugins->pipectl).
                    Não sei exatamente como é a utilização de named-pipes emVB mas acredito que seja da mesma forma que em "C", ou seja, você abre a pipe em \\.\pipe\pw3270 envia a string "status" (sem aspas e sem cr-lf) e espera a resposta na mesma pipe. Se ajuda, em "C", usei a função "TransactNamedPipe" do windows para fazer a pergunta e esperar a resposta numa única operação.
                    O fonte de um pequeno cliente em "C" pode ser encontrado em svn.​soft​ware​publ​ico.​gov.​br/s​vn/p​w327​0/tr​unk/​v4.0​/src​/plu​gins​/pip​ectl​/pip​etes​t.c

                    Outros comandos já implementados:

                    cstate - Retorna o status da conexão
                    luname - Retorna somente o nome da LU.

                     

                    Críticas e sugestões são bem vindas.

                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                      27 de Janeiro de 2010, 12:08

                       

                      Olá,

                       

                          Estarei testando o cliente para o named pipe nos próximos dias. O que constatei inicialmente é que o wpr3287.exe do x3270 original funciona normalmente em ambiente de sessão TN3270E associada com o pw3270, então o problema fica resumido a estabelecer a comunicação entre os processos.

                       

                           Grato

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

                         

                        Olá,

                        Sim, funciona. Até porque do ponto de vista do host são conexões separadas. Andei vendo a possibilidade de migrar o cliente pr3287 original para funcionar com a lib3270.dll e, posteriormente, integra-lo no pw3270 mas isso deve levar um tempo. Alem disso não tenho acesso fácil a uma LU de impressão para testar.

                        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                          28 de Janeiro de 2010, 10:01

                           

                          Olá,

                           

                             Nos primeiros testes percebi que o pipe fica "disponível" por poucos instantes, é necessário fazer várias consultas para obter a resposta. Alguma idéia sobre o que acontece? Também percebi que o plugin não gerencia mais de 1 uma sessão, no caso pergunto se seria possível implementar consulta genérica, para obter a lista de sessões, e consulta específica, passando como argumento um ID de sessão, a própria LU, etc.

                           

                           

                                Grato

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

                             

                            Eu fecho a pipe logo após enviar a resposta; o problema é que eu não estava conseguindo saber quando o cliente encerra a conexão, daí, ela ficava presa.

                             É relativamente fácil colocar a lista de instâncias num bloco de memória compartilhada mas, como os processos são separados seria preciso usar uma pipe para cada sessão.

                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                              28 de Janeiro de 2010, 17:50

                               

                              Olá,

                               

                                  O que está acontecendo pode estar ligado ao cliente em C. O problema é que se você  executa o pipetest.exe e o resultado do named pipe não aparece, o pipetest.exe fica trancado esperando (processo dummy). Olhei na documentação da API e a chamada TransactNamedPipe não tem timeout, apenas um parâmetro LPOVERLAPPED para tornar a comunicação assíncrona, mas pede a criação de um trap de eventos, o que já estaria bem além do meu conhecimento da linguagem C e até do VB (saudades do shellscript, bem mais fácil). Você conhece algum programador que já tenha visitado esse problema?

                               

                               

                                 Grato

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

                                 

                                Olá,

                                Ele deveria ficar parado no WaitNamedPipe devido ao parâmetro NMPWAIT_WAIT_FOREVER (espera para sempre, sem timeout) e não no TransactNamedPipe já que, em teoria, na hora da transação a pipe deveria estar disponível.

                                O plugin do pw3270 está usando o LPOVERLAPPED que, sinceramente, achei uma estrutura tremendamente complicada para uma coisa tão simples ( que saudade do select()! )

                                Quanto a algum programador que esteja com esse problema: Eu! Apanhei quase 1 mês com esse sistema de pipes do windows durante o porte de outro aplicativo que foi originalmente construído para linux.

                                A sua necessidade é só chamar o pr3287 com parâmetros ou esse outro aplicativo tem alguma outra função? Pergunto porque talvez seja possível usar um botão na toolbar ou elemento de menu para chamar o pr3287 passando parâmetros através da tag <script> nos arquivos da ui. Ainda está em desenvolvimento mas não deve demorar muito tempo para ficar disponível já que preciso dela aqui no BB.

                                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                  29 de Janeiro de 2010, 10:59

                                   

                                  Olá,

                                   

                                       Fazendo um debug confirmei que o programa fica preso no TransactNamedPipe. É necessário matar o processo quando a execução tranca. Segue um trecho do prompt do MS-DOS:

                                  C:\Documents and Settings\b31935\Desktop>pipetest status
                                  WaitNamedPipe(\\.\PIPE\pw3270)
                                  O sistema nÒo pode encontrar o arquivo especificado.
                                  (rc=2)

                                  C:\>pipetest status
                                  ^C
                                  C:\>pipetest status
                                  CONNECTED_TN3270E TL2R mf
                                  C:\>pipetest status
                                  ^C
                                  C:\>pipetest status
                                  CONNECTED_TN3270E TL2R mf
                                  C:\>pipetest status
                                  ^C
                                  C:\>pipetest status
                                  ^C
                                  C:\>pipetest status
                                  ^C
                                  C:\>pipetest status
                                  CONNECTED_TN3270E TL2R mf

                                  Pode ser relativo também à configuração da estação de teste aqui, pois o cliente em c usa vários valores default. Quanto à chamada do wpr3287, é necessario que seja automática e que seja passado o nome da LU no parâmetro -assoc . Se funcionar ficaria idêntico ao dos emuladores comerciais.

                                         Grato

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

                                     

                                    Olá,

                                    Esse sistema de pipes do windows é realmente muito confuso mas, quando ao wpr3287: É possível associar um script ou programa externo às operações de connect/disconnect da mesma forma que é feito com os elementos da interface. Resta definir como configurar isso já que, na minha opinião, usar os arquivos de descrição de interface ia ficar meio confuso. 

                                    Talvez uma entrada separada no .conf ou, quem sabe, um .xml separado só para isso. É melhor maturar um pouco a idéia.

                                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                      29 de Janeiro de 2010, 14:45

                                       

                                      Olá,

                                       

                                           É possível adotar essa solução do botão (ou outro controle) na interface, mas deveria haver uma forma de controlar sua exibição para que não esteja disponível em todas as sessões, se possível até passando um parâmetro na linha de comando. O "comportamento" padrão do botão seria, como já foi referido, chamar a execução do wpr3287.exe (localizado no mesmo diretório do pw3270) com o nome da LU no parâmetro -assoc e com outros parâmetros definidos nas configurações (diretório ui). Exemplo: <dir_pw3270>/wpr3287.exe -assoc <luname> [definições no .xml] HOST:PORTA

                                       

                                         Grato

                                      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                        1 de Fevereiro de 2010, 9:37

                                         

                                        Olá,

                                        Via linha de comando fica fácil implementar uma opção do tipo pw3270 --on-lu="<dir>/wpr3287.exe --assoc %{luname}"  que ativaria o wpr3270.exe na hora em que o nome da LU estivesse disponível.

                                        Implemento isso em pouquíssimo tempo.

                                        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                          3 de Fevereiro de 2010, 10:07

                                           

                                          Olá,

                                           

                                             Essa proposta de solução atenderia positivamente com relação à solução para sessões de impressora associadas e também agregaria funcionalidades ao emulador. Testarei assim que o pacote for disponibilizado no portal SPB.

                                           

                                              Grato.

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

                                             

                                            Olá,

                                            Acabei de enviar outra prévia do pw3270 4.1 que inclui o parâmetro "--onlu=" para a área de arquivos em desenvolvimento.

                                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                              4 de Fevereiro de 2010, 12:56

                                               

                                              Olá

                                               

                                                 Testei o comando "C:\Arquivos de programas\pw3270\pw3270.exe" --host=<HOST> --on-lu="C:\Arquivos de programas\pw3270\wpr3287.exe -ffskip -trace -assoc %{luname} <HOST>"  que não funcionou, o erro é argumento inválido. Testei também com o argumento original: "C:\Arquivos de programas\pw3270\pw3270.exe" --host=<HOST> --on-lu="<dir>/wpr3287.exe -assoc %{luname} <HOST>", com a mesma resposta de erro. Na log aparece "GLib-GObject g_object_get_data: assertion `G_IS_OBJECT (object)' failed". Alguma idéia?

                                               

                                                   Grato

                                              • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                4 de Fevereiro de 2010, 15:27

                                                 

                                                Olá

                                                 

                                                     A mensagem de erro indica que o argumento para a opção --on-lu é inválido, mas pergunto se o pw3270 "espera" a conexão para inicializar a "variável" do luname, ou já lança o valor imediatamente após o início de sua execução?

                                                 

                                                 

                                                     Grato

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

                                                   

                                                  Olá,

                                                  Ele lança o scrtipt do --on-lu no momento em que obtem do host o nome da LU; não no momento da inicialização.

                                                  • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                    5 de Fevereiro de 2010, 12:03

                                                     

                                                    Olá,

                                                     

                                                       Os testes funcionaram positivamente, inclusive com várias sessões. O subshell permite execução de qualquer programa, o que permite muita facilidade para a implementação de suites, projetos, etc. O que pergunto é se a execução do subshell está ligada a cada sessão, e portanto se seria possível fornecer um parâmetro para encerrá-la automaticamente quando a a sessão a que estivesse "ligada" fosse encerrada. No caso do TN3270 isso é já está implementado, mas pergunto a nível de execução, não importando o que o pw3270 "chame".

                                                     

                                                        Grato

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

                                                       

                                                      Olá,

                                                      Ligada diretamente não, porém, o pw3270 guarda o PID do subshell (e monitora quando ele sai) de forma que posso mandar encerrar o processo quando a conexão com o host for encerrada.

                                                      • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                        11 de Fevereiro de 2010, 9:44

                                                         

                                                        Olá,

                                                         

                                                               O wpr3287 não simula a funcionalidade dos emuladores comerciais de se "matar" quando a sessão de terminal do pw3270 é encerrada, portanto acredito que a solução seja realmente a proposta nas mensagens anteriores, i.e., o PW3270 "mata" a sessão de impressão. Se for possível também pode ser implementado um parâmetro para desabilitar/habilitar essa funcionalidade quando se usa a opção --on-lu.

                                                         

                                                            Grato

                                                        • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                          12 de Fevereiro de 2010, 10:58

                                                           

                                                          Olá,

                                                          Em linux é fácil. Um SIGTERM deve resolver o problema; vou ter que dar uma procurada é na forma de fazer isso em windows.

                                                          • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                            9 de Março de 2010, 16:41

                                                             

                                                            Olá

                                                             

                                                                A nova versão de desenvolvimento funciona muito bem, mas já foi possível implementar alguma funcionalidade do SIGTERM?

                                                             

                                                              Grato

                                                            • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                              9 de Março de 2010, 17:18

                                                               

                                                              Olá,

                                                              Implementei hoje cedo o sigterm automático quando a LU não fica mais disponível; fiz um teste rápido em windows & linux e, aparentemente, funcionou. Falta só fazer o commit e gerar os novos instaladores.

                                                              A propósito: O tratamento de clipboard também já deve estar ok.

                                                          • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                            10 de Março de 2010, 9:56

                                                             

                                                            Acabei de subir para a área de arquivos uma versão de desenvolvimento que já implementa o fechamento do processo por sigterm em linux e TerminateProcess em windows.

                                                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                              10 de Março de 2010, 12:23

                                                               

                                                              Olá

                                                               

                                                                  O encerramento "automático" de processo funcionou nos testes. Encerra o processo chamado na opção --on-lu. Surgiu uma dúvida quanto a este processo chamada pela opção --on-lu ser um script, que acaba chamando outros processos. Estes serão também encerrados ou é necessário tratar dessa parte no próprio script, sendo que nem sempre se tem acesso ao código e/ou o perigo de deadlock é bastante alto?

                                                               

                                                                Grato

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

                                                                 

                                                                Olá,

                                                                Se o script rodar, chamar outros processos e sair esses processo não vão ser encerrado já que o pw3270 vai receber o aviso de término do script e limpar o pid salvo. Nesse caso uma alternativa seria usar um programa de controle que trate o SIGTERM e encerre seus filhos.

                                                                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                  11 de Março de 2010, 17:25

                                                                   

                                                                  Olá,

                                                                   

                                                                      Estou fazendo o protótipo do controlador em C (puro), e verifiquei que o tratador do signal do C não reconhece o tipo de signal que está sendo enviado pelo PW3270. Programei a espera pelo SIGTERM (15) e pelo SIGBREAK (21) mas não funcionou. Pergunto então qual o tipo de signal que o PW3270 envia após a desconexão.

                                                                   

                                                                     Grato,

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

                                                                     

                                                                    Olá,

                                                                    Você está testando em linux ou windows? Pergunto porque o comportamento é diferente...

                                                                    Em linux ele manda um SIGTERM:

                                                                     if(kill( (pid_t) on_lu_pid, SIGTERM) < 0)
                                                                     Em windows é usada a função de API TerminateProcess; não sei se ela envia algum sinal:

                                                                    if(!TerminateProcess((HANDLE) on_lu_pid, -1))

                                                                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                      12 de Março de 2010, 10:40

                                                                       

                                                                      Olá

                                                                       

                                                                         Estou testando no Windows XP, realmente o tratamento de sinais no windows é diferente, por isso pergunto se você pode implementar um envio de SIGTERM "extra" para o processo chamado no --on-lu antes das instruções TerminateProcess.

                                                                       

                                                                            Grato

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

                                                                         

                                                                        Olá,

                                                                        Posso tentar mas, pelo que andei olhando, a implementação da função "signal" em windows/MinGW chama a função TerminateProcess, alias, a parte de código que eu usei foi copiada de um patch que implementa a função signal isso no MinGW.

                                                                        Não cheguei a confirmar mas *parece* que, em windows, se você criar uma fila de janelas a função TerminateProcess manda uma mensagem WM_QUIT para o processo.

                                                                        Mas, já que você está escrevendo em C porque não implementa isso como um plugin direto no pw3270? Ao invés de um programa externo chamado pelo on-lu basta você compilar o seu código como uma DLL e exportar uma única função pw3270_plugin_update_luname que vai ser chamada sempre que o nome de LU mudar.

                                                                         O código ficaria algo mais ou menos assim...

                                                                        #include <lib3270/api.h>
                                                                        #include <lib3270/plugins.h>

                                                                        PW3270_PLUGIN_ENTRY void pw3270_plugin_update_luname(GtkWidget *topwindow, const gchar *lu)
                                                                        {
                                                                        if(lu) {  // Tem nome de LU, acabou de conectar; executa acoes correspondentes. } else { // Nao tem nome de LU, trata uma desconexão.
                                                                        }

                                                                        }
                                                                         

                                                                        Nota: A macro PW3270_PLUGIN_ENTRY existe só para conveniência, você pode substituir pela declaração "export" padrão do compilador que você está usando ( no MinGW ela resolve como _dllexport )

                                                                        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                          12 de Março de 2010, 15:42

                                                                           

                                                                          Olá

                                                                           

                                                                             Acredito que com a implementação do SIGTERM o problema será resolvido, mas quanto à solução por plugin, pode ser condicionalmente ativada através da opção de linha de comando?

                                                                           

                                                                                 Grato

                                                                          • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                            12 de Março de 2010, 16:04

                                                                             

                                                                            Olá,

                                                                            O SIGTERM resolveria sim; o problema é que não descobri como enviar sinais para outro processo windows. Pela documentação na MSDN o windows só parece ter a função raise que só atua dentro do mesmo processo.

                                                                            Quanto à ativação do plugin ela pode ser feita manualmente com o argumento de linha --plugin=[PATH]/plugin.dll

                                                                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                              22 de Março de 2010, 15:03

                                                                               

                                                                              Olá

                                                                               

                                                                               

                                                                                 Já tenho aqui um protótipo que receberia o SIG_TERM e encerraria os processos. Pesquisei também o TerminateProcess, que realmente é uma interrupção incondicional da operação do processo, e programar um "trap" para esse tipo de interrupção pode gerar falhas de segurança.

                                                                               

                                                                                    Grato

                                                                              • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                22 de Março de 2010, 16:28

                                                                                 

                                                                                Olá,

                                                                                Você descobriu como manda um sigterm para outro processo em windows? Nos testes que fiz aqui o sinal só funciona se mandando dentro de um mesmo processo.

                                                                                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                  22 de Março de 2010, 16:40

                                                                                   

                                                                                  Olá

                                                                                   

                                                                                      Ainda não tive tempo de pesquisar a geração do SIGTERM, vou pesquisar isso então. Quanto ao plugin, estou usando agora o Visual C++ 2008. Consigo definir o projeto para compilar com DLL, mas não encontro o arquivo plugins.h no SDK de desenvolvimento do pacote para Windows. Esse arquivo é realmente necessário ou posso montar um header "caseiro" aqui com o export para a função pw3270_plugin_update_luname?

                                                                                   

                                                                                   

                                                                                     Grato

                                                                                  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                    22 de Março de 2010, 17:01

                                                                                     

                                                                                    Olá,

                                                                                    O instalador windows não estava instalando o plugins.h; de qualquer forma você pode usar um header caseiro com o protótipo abaixo (para "C" puro):

                                                                                      extern __declspec (dllexport) void pw3270_plugin_update_luname(GtkWidget *topwindow, const gchar *luname);

                                                                                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                      22 de Março de 2010, 17:06

                                                                                       

                                                                                      Olá

                                                                                       

                                                                                         Com o header caseiro aconteceram erros de compilação:

                                                                                       

                                                                                      1>projects\teste.cpp(11) : error C2065: 'GtkWidget' : undeclared identifier
                                                                                      1>projects\teste.cpp(11) : error C2065: 'topwindow' : undeclared identifier
                                                                                      1>projects\teste.cpp(11) : error C2059: syntax error : 'const'
                                                                                      1>projects\teste.cpp(13) : error C2143: syntax error : missing ';' before '{'

                                                                                       

                                                                                      Preciso registrar algum include além do api.h? Qual a melhor maneira para se compilar um plugin do pw3270?

                                                                                       

                                                                                        Grato

                                                                                       

                                                                                      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                        22 de Março de 2010, 17:31

                                                                                         

                                                                                        Olá,

                                                                                        Faltou o sdk do gtk. Eu não tinha considerado a possibilidade de plugins que não utilizassem a biblioteca gtk+, porém, como você só precisa da LU mude o protótipo removendo os tipos do gtk (gtkwidget * muda para void * e gchar * muda para char *); nesse caso ficaria...

                                                                                         extern __declspec (dllexport) void pw3270_plugin_update_luname(void *topwindow, const char *luname);
                                                                                         

                                                                                        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                          22 de Março de 2010, 17:39

                                                                                           

                                                                                          Olá

                                                                                           

                                                                                              Compilou com o header caseiro, mas agora o pw3270.exe não está reconhecendo o parâmetro --plugin="C:\teste.dll" (exemplo). Alguma sugestão?

                                                                                          • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                            24 de Março de 2010, 8:59

                                                                                             

                                                                                            Olá,

                                                                                             Tentou --plugins= (com S no final)? O parâmetro é no plural porque ele aceita mais de uma .dll separada por vírgulas. Você pode usar também --plugin-path= para indicar um diretório contendo mais de uma .dll ou, o mais simples, colocar a dll no diretório pw3270/plugins que ele carrega sozinho.

                                                                                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                              24 de Março de 2010, 10:09

                                                                                               

                                                                                              Olá

                                                                                               

                                                                                                  Para testar joguei a dll direto no diretório dos plugins, mas o PW3270 não executou. Pergunto:

                                                                                               

                                                                                              - Há restrições quanto ao uso da stdout (funções como printf e/ou cout<< no c++) dentro do código da dll?

                                                                                              - É possível usar c++?

                                                                                              - O PW3270 dispara a função exportada (plugin_update...) automaticamente?

                                                                                               

                                                                                                  Grato

                                                                                              • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                24 de Março de 2010, 10:37

                                                                                                 

                                                                                                Olá,

                                                                                                No pw3270 em sí não há restrição ao uso do printf mas que eu me lembre o windows não permite usar stdout em aplicações gui, isto é, a função funciona mas nada acontece. Em linux funciona normalmente (uso isso para debug).

                                                                                                Nunca testei com C++ mas, desde que a função exportada esteja no formato C ( extern "C" { } ) deve funcionar normalmente.

                                                                                                 A função é chamada automaticamente toda vez que o nome da LU muda.

                                                                                                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                  24 de Março de 2010, 15:05

                                                                                                   

                                                                                                  Olá

                                                                                                   

                                                                                                     O uso do printf seria para a depuração, mas estou utilizando "messagebox" para o Windows XP. O problema é a codificação, pois estão aparecendo caracteres nas mensagens. Pergunto se existe uma máscara de código de caracteres nas chamadas de "messagebox" do PW3270.

                                                                                                   

                                                                                                        Grato

                                                                                                  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                    24 de Março de 2010, 15:43

                                                                                                     

                                                                                                    Olá,

                                                                                                    A GUI é baseada no GTK que usa o padrão UTF-8 para todas as plataformas.

                                                                                                     

                                                                                                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                      24 de Março de 2010, 16:16

                                                                                                       

                                                                                                      Olá

                                                                                                       

                                                                                                        O problema resolvido do UTF-8 foi resolvido. Agora a bola da vez é a seguinte: estou usando CreateProcess para chamar o wpr3287 e percebi que a handle parece estar sendo reinicializada antes da desconexão, ou seja, quando vou encerrar o wpr3287 o pw3270 não "sabe" mais a PID do processo criado. É possível exportar uma variável global a partir do plugin no PW3270, de forma que a função do plugin pudesse recebê-la como argumento na próxima execução? Assim a handle do processo seria mantida até a próxima conexão.

                                                                                                       

                                                                                                           Grato

                                                                                                      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                        24 de Março de 2010, 17:25

                                                                                                         

                                                                                                        Olá,

                                                                                                        Porque você não declara uma variável global dentro do plugin? Como a DLL não é descarregada em nenhum momento essa variável  manteria o seu valor entre as chamadas. Algo do tipo:

                                                                                                        /*
                                                                                                        * sample.c
                                                                                                        */
                                                                                                        static HANDLE hPR3287 = NULLHANDLE;

                                                                                                        void pw3270_plugin_update_luname(void *topwindow, const gchar *lu)
                                                                                                        {
                                                                                                        if(lu)
                                                                                                        {
                                                                                                        /* Cria processo, salva handle em hPR3287 */

                                                                                                        }
                                                                                                        else if(hPR3287 != NULLHANDLE)
                                                                                                        {
                                                                                                        /* Tem processo ativo, encerro */
                                                                                                        TerminateProcess(hPR3287,-1);
                                                                                                        }
                                                                                                        }

                                                                                                         

                                                                                                        Outra opção seria salvar o handle como atributo de topwindow usando o gtk mas daí você precisaria incluir a gtklib e seus includes.

                                                                                                        • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                          24 de Março de 2010, 17:57

                                                                                                           

                                                                                                          Olá

                                                                                                           

                                                                                                             Funcionou a solução proposta, também funcionou usando o _dllexport nas variáveis relacionadas ao controle de processos. O problema aconteceu no teste em outras estações (o velho princípio do "no meu PC funciona")  em que a DLL foi carregada (suponho) sem erros (nada apareceu) mas não chamou o wpr3287, e também não disparou as mensagens de erro. Pode ser problema de dependências da DLL? Usei a opção --plugins=

                                                                                                           

                                                                                                             Grato

                                                                                                          • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                            25 de Março de 2010, 22:54

                                                                                                             

                                                                                                            Olá,

                                                                                                            Em teoria o _dllexport não deveria ser necessário nas variáveis de uso interno da DLL já que, por ser internas, não deveriam ser exportadas.

                                                                                                            Quanto à carga, pode ser a falta de alguma outra dll da qual a sua depende sim; um problema comum é a falta do runtime do msvc que faria com que a dll carregasse normalmente na máquina que tem o SDK e falhasse nas outras.

                                                                                                            • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                              31 de Março de 2010, 12:45

                                                                                                               

                                                                                                              Olá

                                                                                                               

                                                                                                                 Testei com o runtime do MSVC 2008 e 2005 sem resultados. Refiz todos os atalhos no código da DLL, mas realmente nenhuma mensagem é emitida, mesmo que seja indicada uma dll inexistente na chamada --plugins= . Alguma sugestão?

                                                                                                               

                                                                                                               

                                                                                                               

                                                                                                              Grato

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

                                                                                                                 

                                                                                                                Possibilidades...

                                                                                                                Colocar a dll no diretório "plugins" dentro da pasta onde está o pw3270.exe;
                                                                                                                Passar o path completo da DLL no parâmetro;
                                                                                                                Tentar com o pacote que acabo de mandar para a área de arquivos que inclui o parâmetro --log= para criar um arquivo de log que recebe eventuais mensagems de erro na carga do módulo; também implementa uma caixa de diálogo quando uma DLL informada no --plugins não é encontrada.

                                                                                                                • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                                  13 de Abril de 2010, 9:50

                                                                                                                   

                                                                                                                  Olá

                                                                                                                   

                                                                                                                     Após os testes a log da opção --log não foi devidamente atualizada, mas não confirmei as permissões do diretório, então pode ter sido essa a razão.

                                                                                                                     Pergunto se o fato da DLL não funcionar pode estar também ligado à versão do .NET, no caso testei em uma máquina com .NET 3.5 e funcionou, enquanto os testes em uma máquina com .NET 2.0 não foram bem-sucedidos.

                                                                                                                     Outra pergunta é sobre a passagem de parâmetros para plugins, no caso eu passo um nome de arquivo para que uma função do plugin leia e processe informações, etc. Esse parâmetro pode ser passado na linha de comando?

                                                                                                                   

                                                                                                                   

                                                                                                                   

                                                                                                                                Grato

                                                                                                                  • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                                    13 de Abril de 2010, 10:47

                                                                                                                     

                                                                                                                    Olá,

                                                                                                                    Estranho; testei o --log= em windows e linux e funcionou normal mas, se ele não conseguiu trocar/atualizar a lib3270.dll pode ser esse o problema.

                                                                                                                    Quanto à depêndencia do .NET não posso afirmar mas é possível que sim caso a sua dll precise de algo do .NET para funcionar.

                                                                                                                    Nunca tinha pensado numa forma de passar parâmetros para plugins, por isso, não foi implementada. Uma idéia seria implementar um segundo arquivo de configuração (session.conf) onde ficariam, alem de opções de plugin, os dados do host.

                                                                                                                    • 4f679703f287ebc647b232b82aeea132?only path=false&size=50&d=404Eduardo Bisogno Andrade(usuário não autenticado)
                                                                                                                      8 de Junho de 2010, 12:09

                                                                                                                       

                                                                                                                      Olá

                                                                                                                       

                                                                                                                          Apenas para complementar essa thread, realmente não foi possível resolver com a DLL, muitas horas de programação para um problema simples, fiquei com a solução do programinha batch passando pelo "--on-lu".

                                                                                                                          Vi também que vários programas e jogos para Windows, além de instalar o DirectX, instalam na surdina o virtual c++ runtime e mexem com toda a máquina rsrsrsrss...

                                                                                                                       

                                                                                                                           Grato

                                                                                                                      • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                                                                                        8 de Junho de 2010, 13:44

                                                                                                                         

                                                                                                                        Olá,

                                                                                                                        A DLL chegou a funcionar? Se não houver empecilho em você me mandar o fonte posso compilá-la com o MinGW, que não precisa do runtime virtual C++

                                              • 3f09f0772d9354bc3661d73bf02b0f60?only path=false&size=50&d=404Perry Werneck(usuário não autenticado)
                                                5 de Fevereiro de 2010, 10:09

                                                 

                                                Olá,

                                                O problema era causado pela falta de dois arquivos no runtime gtk. Já corrigi e enviei um novo pacote de instalação.

Essa comunidade não possui posts nesse blog