Escrevendo no console com uma Aplicação PB.

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:
The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, PowerBuilder and tagged , , , , , .