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:
Latest posts by Breno RdV (see all)
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
- Ordenando um DataFrame por múltiplas colunas. (#python #pandas #jupyter #dev #data) - agosto 3, 2022