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.