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
query("status"): "CONNECTED_TN3270E T2ZABFPN 3270.intranet"
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.softwarepublico.gov.br/svn/pw3270/trunk/v4.0/src/plugins/pipectl/pipetest.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.
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
Em windows é usada a função de API TerminateProcess; não sei se ela envia algum sinal: if(!TerminateProcess((HANDLE) on_lu_pid, -1))
#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 )
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
* 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.
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.