Escrevendo no console com uma Aplicação PB.

Escrevendo no console com uma Aplicação PB.

Overview

Mergulhe no universo do desenvolvimento Cliente/Servidor com PowerBuilder! Este post oferece um guia passo a passo sobre como adicionar funcionalidades de console a suas aplicações, apesar das limitações nativas da ferramenta. Através de um método simples, ensinamos como fazer sua aplicação PowerBuilder comunicar-se diretamente com o prompt de comando, usando funções externas do Windows. Ideal para desenvolvedores à procura de soluções práticas e eficientes, venha descobrir como transformar suas ideias em realidade!

O PowerBuilder é uma ótima ferramenta para desenvolver aplicações Cliente/Servidor, mas não é exatamente flexível quando tratamos de funcionalidades ligadas ao console (prompt de comando). Nativamente, ele não possui uma funcionalidade que permita a aplicação escrever mensagens em um console. O fonte abaixo resolve este problema!

1. Crie um User Object.

2. Declare as seguintes funções externas locais:

FUNCTION boolean AttachConsole(long ProcID) LIBRARY "kernel32.dll"
FUNCTION long GetStdHandle(long nStdHandle) LIBRARY "kernel32.dll"
FUNCTION int FreeConsole() LIBRARY "Kernel32.dll"
FUNCTION ulong WriteConsole(long Handle, String OutPut, long NumCharsToWrite, &
     REF long NumCharsWritten, long reserved) LIBRARY "Kernel32.dll" ALIAS FOR "WriteConsoleW"
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
SUBROUTINE ExitProcess(ulong uExitCode) LIBRARY "kernel32.dll"

3. No evento construtor (constructor), insira o código abaixo:

IF Handle(GetApplication()) > 0 THEN
   IF AttachConsole(ATTACH_PARENT_PROCESS) THEN
      hwnd = GetStdHandle(STD_OUTPUT_HANDLE)
   ELSE
      SetNull(hwnd)
   END IF
END IF

4. No evento destrutor (destructor), insira o código:

IF Handle(GetApplication()) > 0 THEN
   keybd_event( 13, 1, 0, 0 )
   FreeConsole()
   ExitProcess(1)
END IF

5. Crie uma função que receba uma string. (Exemplo: uf_writeln(string as_line))

6. Insira o código abaixo nele:

string s
long result

IF Handle(GetApplication()) = 0 OR IsNull(hwnd) THEN
   MessageBox("Debug", as_line)
ELSE
   s = as_line + "~r~n"
   WriteConsole(hwnd, s, len(s), result, 0)
END IF

7. Divirta-se!

Antes de sair escrevendo loucamente no console, veja algumas observações sobre esta abordagem:

  • Chamadas de funções externas não são boas para performance. Cuidado para não exagerar!
  • Se você executar a aplicação pela IDE ou o console não estiver disponível, será exibida uma Message Box.
  • Não é possível redirecionar a saída da aplicação para um arquivo texto (aplicacao.exe > log.txt).

As duas últimas observações são relativas a API do Windows.

Referência: