Abrindo arquivos com a aplicação padrão a partir do PowerBuilder

O PowerBuilder possui uma função nativa para executar comandos externos (run), mas nem sempre ela funciona conforme o esperado. Este comando funciona muito bem para rodar outros executaveis ou linhas de comando de outra aplicação, mas abrir um .DOCX pode não  funcionar. Neste post, mostro uma alternativa.

Infelizmente, para fazer isso precisaremos de criar uma função externa, conforme o exemplo abaixo:

FUNCTION long ShellExecuteW( ulong hWnd, string Operation, string lpFile, string  lpParameters, string lpDirectory, int nShowCmd ) LIBRARY "shell32.dll"

 

Uma vez que isso foi feito, agora precisamos apenas chamar esta função, certo? Sim, mas vamos dar uma olhada nos argumentos da função ShellExecuteW

  • ulong hWnd: Handle da janela associada a operação. Em teoria, este valor pode ser nulo se a operação que será realizada não depender ou não estiver associada a janela;
  • string Operation: Qual operação será realizada. Valores válidos são: edit, explore, find, open, print e NULL. (Você deve ter adivinhado, vamos utilizar a opção open.);
  • string lpFile: Arquivo que será utilizado na operação;
  • string lpParameters: Parametros que serão passados para a aplicação;
  • string lpDirectory: Diretório atual/de trabalho. (working directory);
  • int nShowCmd: Flag que indica como o arquivo deve ser exibido após aberto. Como esta flag será interpretada é a responsabilidade da aplicação que está recebendo a requisição. Valores válidos: SW_HIDE, SW_MAXIMIZE, SW_MINIMIZE, SW_RESTORE, SW_SHOW, SW_SHOWDEFAULT, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE, SW_SHOWNA, SW_SHOWNOACTIVATE e SW_SHOWNORMAL. Cada um possui um valor numérico correspondente;

 

Vamos precisar disso tudo? Não, mas eu queria fazer uma breve explicação mesmo assim.

 

Abaixo está um exemplo de como chamar este comando:

ShellExecuteW(handle(THIS), "open", ls_filename, ls_null, ls_null, 1)

De todos aqueles parâmetros, precisamos mesmo do segundo (operação a ser realizada), do terceiro (nome do arquivo) e do último (flag da ação).

 

Para facilitar a vida de vocês, disponibilizei um user object no meu github. Se você utilizar este user object, basta utilizar a função uf_open, conforme o exemplo abaixo:

uo_fileopen luo_fileopen
luo_fileopen = CREATE uo_fileopen

luo_fileopen.uf_open("c:\temp\relatorio.docx")

DESTROY luo_fileopen

 

Espero ter ajudado.

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 , , .