Executar aplicativo através do windows (substitui o RUN)

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Executar aplicativo através do windows (substitui o RUN)

Mensagem por MARCELOG »

Olá pessoal,
se eu sei alguma coisa de clipper e xHarbour, o mérito é todo de vocês.
Então, uma singela contribuição.
Não é nada de novo ou mirabolante, é simplesmente uma função xHarbour que chama uma api do Wndows para executar qualquer programa 32 bits.
A vantagem é que funciona com base no Shell do Windows, ou seja, se você passar apenas o nome do arquivo, ela chama o aplicativo respectivo associado.

Síntese:

ShellExecuteEx(nomedoaplicativo,nomedoarquivo)

Exemplo:

ShellExecuteEx(nil,"teste.txt")
Essa chamada, considerando a instalação padrão do Windows, vair abrir o arquivo teste.txt com o notepad, se ele tiver menos de 64K.
Se tiver mais, o wordpad vai ser usado.

ShellExecuteEx(nil,"teste.doc")
Essa chamada, considerando a instalação padrão do Windows, vair abrir o arquivo teste.doc com o word.

ShellExecuteEx("wordpad.exe","teste.rtf")
Essa chamada, vai tentar abrir o arquivo teste.rtf com o wordpad, se outro aplicativo não estiver associado a extensão.

ShellExecuteEx("calc.exe",nil)
Essa chamada executa a calculadora do Windows.

Dica: eu configurei a função para, primeiro, tentar abrir o arquivo passado com o aplicativo associado pelo windows.
Então, não adiante querer abrir um .txt com o word ou um .doc com o wordpad em uma instalação padrão.
Mas com isso, você cria um arquivo com uma extensão somente sua (que tal MGS), e o executa através de qualquer aplicativo.

ShellExecuteEx("winword.exe","teste.mgs")
Essa chamada, considerando a inexistência de referência para a extensão .mgs, vair abrir o arquivo teste.mgs com o word.

Se você quiser liberdade total, "santo perfeccionismo", mude as referências hb_parc abaixo.

Ou então, mais lógico né, associe a extensão do arquivo ao aplicativo windows que deve abrí-lo.
txt=wordpad
doc=word
rtf=wordpad
xls=excel

e aí vai

Código: Selecionar todos

#pragma BEGINDUMP

#include <conio.h>
#include <windows.h>
#include <winbase.h> 
#include <hbapi.h>

HB_FUNC( SHELLEXECUTEEX )

{

 SHELLEXECUTEINFO sei;

 sei.cbSize  = sizeof(sei);

 sei.fMask   = SEE_MASK_NOCLOSEPROCESS;

 sei.lpVerb  = "open";

 sei.lpFile  = hb_parc(2);

 sei.nShow   = SW_SHOW;

 if (ShellExecuteEx(&sei))
 {
 WaitForSingleObject(sei.hProcess,INFINITE);
 hb_retl(TRUE);
 }
 else
 {
  sei.lpFile  = hb_parc(1);
  sei.lpParameters = hb_parc(2);
  if (ShellExecuteEx (&sei))
  {
   WaitForSingleObject(sei.hProcess,INFINITE);
   hb_retl(TRUE);
  }
 }
}

#pragma ENDDUMP
Espero ter ajudado.

MarceloG
De Divinópolis/MG para o mundo.

:)Pos
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Prezado Marcelo,

Não conseguí testar porque não sei nada de xHarbour. Sei que é pedir de mais... alguém poderia compilá-la e disponibilizá-la no fórum ? Achei interessante, não sei se vai funcionar em Clipper. Mas para meu caso específico, eu não utilizo o comando RUN para executar aplicativos Windows. Eu possuo uma bacth que gerencia através de um menu toda chamada dos aplicativos. O exemplo da minha batch é assim:

Código: Selecionar todos

@ECHO OFF
NET USE LPT1: \\SERVIDOR\IMPRESSORA /YES
ECHO . > C:JARODA.SYS
:INICIO
MENU.EXE
IF ERRORLEVEL 255 GOTO FIN
IF ERRORLEVEL 254 CADASTRO.EXE
IF ERRORLEVEL 253 CONSULTA.EXE
IF ERRORLEVEL 252 GOTO WINAPLICA
IF ERRORLEVEL 2 GOTO INICIO
IF ERRORLEVEL 1 GOTO FIN
GOTO INICIO
:WINAPLICA
rem Colocaria o aplicativo de verificação do modo de exibição da janela
START /W C:\ARQUIV~1\INTERN~1\IEXPLORE https://pctoledo.org
GOTO INICIO
:FIN
IF EXIST C:JARODA.SYS DEL C:JARODA.SYS
GOTO SAI
:SAI
Faço isto, para evitar problemas com falta de memoria, para dar maior versatilidade ao sistema e para poder tratar isoladamente a sua manutenção.

Um clip-abraço

Pablo
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho


Vou levar em consideração o seu apelo e verificar o que pode ser util para voce sem ter que fazer muitas alterações.


Pelo que vejo voce possui um aplicativo DOS funcionando como centro de dados e usa pequenos aplicativos Windows de forma periférica, certo?


Bem, tempos atras eu criei um executável em Fivewin para os amigos forenses que consistia em ser um menu for Windows para abrir modulos feitos em qualquer linguagem.


Caracteristicas


- Usa a tecnologia XML para montagem do menu que pode ser alterado pelo programador.
- Abre pequenos aplicativos Windows.
- Abre pequenos aplicativos DOS.


Tudo em uma interface que leva a migração mais suave.


Talvez não seja o seu caso de usar esta ferramenta, mas vou procurar te ajudar.


Uso esta ferramenta em meu sistema, com um completo controle de acesso aos modulos, definindo acessos por usuarios aos menus e etc.

Se não me engano eu havia colocado a versão 2.0 aqui no forum, dê uma olhada.

Aguarde.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Executar aplicativo através do windows (substitui o RUN)

Mensagem por Pablo César »

Estive lendo antigos tópicos e deparei com um pedido meu ainda em aberto...
Não conseguí testar porque não sei nada de xHarbour. Sei que é pedir de mais... alguém poderia compilá-la e disponibilizá-la no fórum ?
Depois de tanto tempo... agora posso dizer que posso compilar em Harbour !!!

Peguei o exemplo do Marcelo e fiz algumas alterações, conforme as minhas necessidades. E o código é este:

Código: Selecionar todos

#include <MiniGui.ch>

Function Main(cExec,cFile,lForce)
Local cStdOut, cStdErr

If cExec=Nil .and. cFile=Nil
   Quit
Endif

If cFile=Nil
   If File(cExec)
      EXECUTE FILE cExec
   Else
      ShellExecute( 0, "open", cExec, cFile, , 1 )
   Endif
else
   If ("www" $ cFile)
      ShellExecuteEx(cExec,cFile)
   Else
      If File(cFile)
	     If lForce=Nil
            EXECUTE FILE cFile
		 Else
		    ShellExecute( 0, "open", cExec, cFile, , 1 )
		 Endif
      Else
		 ShellExecute( 0, "open", cExec, cFile, , 1 )
      Endif
   Endif
Endif
Return Nil

#pragma BEGINDUMP

#include <conio.h>
#include <windows.h>
#include <winbase.h>
#include <hbapi.h>

HB_FUNC( SHELLEXECUTEEX )

{

 SHELLEXECUTEINFO sei;

 sei.cbSize  = sizeof(sei);

 sei.fMask   = SEE_MASK_NOCLOSEPROCESS;

 sei.lpVerb  = "open";

 sei.lpFile  = hb_parc(2);

 sei.nShow   = SW_SHOW;

 if (ShellExecuteEx(&sei))
 {
 WaitForSingleObject(sei.hProcess,INFINITE);
 hb_retl(TRUE);
 }
 else
 {
  sei.lpFile  = hb_parc(1);
  sei.lpParameters = hb_parc(2);
  if (ShellExecuteEx (&sei))
  {
   WaitForSingleObject(sei.hProcess,INFINITE);
   hb_retl(TRUE);
  }
 }
}

#pragma ENDDUMP
O executável e arquivos testes estão em anexo para quem quiser utilizar.
Achei interessante, não sei se vai funcionar em Clipper.
Sim, pode ser utilizado em qualquer linguagem. E o interessante que não precisa informar o caminho onde o Word, IExplore ou outro aplicativo do Windows e vai utilizar o default, mas com a o terceiro parâmetro força a abertura com o aplicativo que for informado (primeiro parâmetro).

Fiz os seguintes testes na linha de comando:
WinExec teste.txt
WinExec teste.doc
WinExec Winword teste.doc
WinExec Winword teste.txt
WinExec Winword.exe teste.txt

WinExec Winword.exe teste.txt ! (notar terceiro parâmetro "!", para forçar abertura com outro editor)
WinExec IExplore.exe "www.pctoledo.com.br"


Espero que gostem !!
Anexos
WinExec.rar
(578.18 KiB) Baixado 296 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder