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:

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

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

1IF Handle(GetApplication()) > 0 THEN
2   IF AttachConsole(ATTACH_PARENT_PROCESS) THEN
3      hwnd = GetStdHandle(STD_OUTPUT_HANDLE)
4   ELSE
5      SetNull(hwnd)
6   END IF
7END IF

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

1IF Handle(GetApplication()) > 0 THEN
2   keybd_event( 13, 1, 0, 0 )
3   FreeConsole()
4   ExitProcess(1)
5END IF

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

6. Insira o código abaixo nele:

1string s
2long result
3
4IF Handle(GetApplication()) = 0 OR IsNull(hwnd) THEN
5   MessageBox("Debug", as_line)
6ELSE
7   s = as_line + "~r~n"
8   WriteConsole(hwnd, s, len(s), result, 0)
9END 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: