Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar un .exe (https://www.clubdelphi.com/foros/showthread.php?t=44407)

jorgegetafe 05-06-2007 21:58:46

Ejecutar un .exe
 
Me gustaría hacer que al presionar un botón se ejecutase un programa de mi ordenador, es decir, un ejecutable (*.exe) del que se su ruta exacta. ¿Es posible? ¿cual es el código?

Muchas gracias.

roman 05-06-2007 22:00:24

Busca WinExec o ShellExecute en los foros.

// Saludos

jorgegetafe 05-06-2007 22:05:12

gracias, saludos

jorgegetafe 05-06-2007 22:09:56

Vale ya se hacerlo:

WinExec(PChar('notepad.exe'),SW_SHOWNORMAL);

Pero como sabe donde está el programa? acaso lo busca? no entiendo como lo hace...

dec 05-06-2007 22:11:55

Hola,

Windows tratará de localizar el programa en el directorio activo, en el del propio Windows, en "System" ó "System32", entre otros...

Pero, generalmente, indicamos la ruta completa del programa a ejecutar.

jorgegetafe 05-06-2007 22:14:50

Y para ejecutar IE? no se donde está su ejecutable, no quiero poner una página en concreto sino la que tenga el usuario como "home"

seoane 05-06-2007 22:29:58

:cool: Prueba con esto:
Código Delphi [-]
ShellExecute(0,nil,'about:home',nil,nil,SW_SHOW);

Acuerdate de agregar ShellApi a las uses

maeyanes 05-06-2007 22:30:06

Cita:

Empezado por dec
Hola,

Windows tratará de localizar el programa en el directorio activo, en el del propio Windows, en "System" ó "System32", entre otros...

Pero, generalmente, indicamos la ruta completa del programa a ejecutar.

También en el registro se guardan las rutas de las aplicaciones, específicamente bajo la clave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

Por ejemplo Internet Explorer tiene un alias específico bajo esta clave, por lo cual si hace un WinExec(PChar('IEXPLORE.EXE'), SW_SHOWNORMAL); te debería abrir sin problemas el IE con su página Home...


Saludos...

roman 05-06-2007 22:33:13

Una opción:

Código Delphi [-]
ShellExecute(0, 'open', 'iexplore.exe', nil, nil, SW_SHOW);

Otra opción (la aprendí hoy del compañero cHackAll )

Código Delphi [-]
var
  IE: OleVariant;

begin
  IE := ComObj.CreateOleObject('InternetExplorer.Application');
  IE.GoHome;
  IE.Visible := true;
end;

// Saludos

roman 05-06-2007 22:34:36

Bueeeeno, ¿se puede saber por qué pasan "horas" y nadie contesta y cuando lo hago se me adelantan?

:p :D

// Saludos

maeyanes 05-06-2007 22:36:17

Cita:

Empezado por roman
Bueeeeno, ¿se puede saber por qué pasan "horas" y nadie contesta y cuando lo hago se me adelantan?

:p :D

// Saludos

Bueno, en algún momento te tenía que pasar lo que nos ha pasado a otros con respecto a ti... :D :p

roman 05-06-2007 22:38:36

Está bueno, vale para tí. :D

seoane, ¿tú que justificación das? :D :D

// Saludos

seoane 05-06-2007 22:38:36

Pero no se quejara, ya le dimos 4 maneras de hacerlo. Y si me apuras le saco alguna mas :p :D

seoane 05-06-2007 22:39:26

Cita:

Empezado por roman
seoane, ¿tú que justificación das? :D :D

Fue a hablar el que siempre me pisa las respuestas :D

jorgegetafe 05-06-2007 22:40:57

Muchas gracias a todos, me va de lujo ;-) esto tiene bastante utilidad. :D

seoane 05-06-2007 22:43:41

Y lo prometido es deuda, hay va otra forma de hacerlo :p

Esta función devuelve la ruta del navegador predeterminado:
Código Delphi [-]
uses Registry;

function Navegador: string;
var
  Cliente: String;
begin
  Result:= '';
  with TRegistry.Create do
  try
    RootKey:= HKEY_LOCAL_MACHINE;
    Cliente:= '';
    if OpenKey('\SOFTWARE\Clients\StartMenuInternet' ,FALSE) then
    begin
      Cliente:= ReadString('');
      CloseKey;
    end;
    if OpenKey('\SOFTWARE\Clients\StartMenuInternet\' + Cliente + '\shell\open\command' ,FALSE) then
    begin
      Result:= ReadString('');
      CloseKey;
    end;
  finally
    Free;
  end;
end;

roman 05-06-2007 22:47:52

Yo voto por esta última. Es la que más respeta la desición del usuario.

// Saludos

roman 05-06-2007 23:03:39

seoane,

el segundo if, ¿no vendría mejor anidarlo en el primero?

// Saludos

seoane 06-06-2007 00:02:02

Cita:

Empezado por roman
seoane, el segundo if, ¿no vendría mejor anidarlo en el primero?

Por poder se puede ...

Código Delphi [-]
uses Registry;

function Navegador: string;
var
  Cliente: String;
begin
  Result:= '';
  with TRegistry.Create do
  try
    RootKey:= HKEY_LOCAL_MACHINE;
    if OpenKey('\SOFTWARE\Clients\StartMenuInternet' ,FALSE) then
    begin
      Cliente:= ReadString('');
      CloseKey;
      if OpenKey('\SOFTWARE\Clients\StartMenuInternet\' + Cliente + '\shell\open\command' ,FALSE) then
      begin
        Result:= ReadString('');
        CloseKey;
      end;
    end;    
  finally
    Free;
  end;
end;

¿mejor? :p

roman 06-06-2007 00:08:13

Yo "nomás" decía. Porque si el primer condicional falla, como que el segundo ya venía sobrando :p

// Saludos

nosferatu177 06-06-2007 01:26:36

aprovechando...ejecutar archivo msi
 
hola buenas tardes, alguien de ustedes podria decirme como hacer q se ejecute un archivo .msi en el evento onclick;es q extoy haciendo un instalador y no logro hacer q se ejecute :S, ya utilice WinExec, pero creo q solo es con los .exe; gracias de antemano

roman 06-06-2007 02:50:35

¿Has probado ShellExecute?

// Saludos

JULIPO 08-08-2007 01:14:11

Muy util esta informacion
 
Pero que pasaria si ademas cuando cierre mi aplicacion, quiero saber si el programa que abri desde mi aplicacion al presionar el boton esta aun ejecutandose y si es asi cerrarlo ;

Este hilo se refiere a la ejecucion de un programa al presionar un boton;

Yo quiero saber si al cerrar mi aplicacion el programa que ejecute al presionar el boton aun esta activo y si es asi cerrarlo junto a mi aplicacion

espero sea clara la pregunta

gracias por su ayuda

Gabo 08-08-2007 17:38:33

Cita:

Empezado por JULIPO (Mensaje 221437)
Pero que pasaria si ademas cuando cierre mi aplicacion, quiero saber si el programa que abri desde mi aplicacion al presionar el boton esta aun ejecutandose y si es asi cerrarlo ;

Este hilo se refiere a la ejecucion de un programa al presionar un boton;

Yo quiero saber si al cerrar mi aplicacion el programa que ejecute al presionar el boton aun esta activo y si es asi cerrarlo junto a mi aplicacion

espero sea clara la pregunta

gracias por su ayuda

Te puede valer la función ShellExecuteEx la cual recibe como parámetro un puntero hacia una estructura de tipo SHELLEXECUTEINFO, si buscas en la ayuda encontrarás información sobre todos sus miembros, donde le puedes indicar el archivo sobre el que vas a trabajar, la acción a realizar ("open", por ejemplo), etc.

Dos miembros de esta estructura que te interesarán son fMask y hProcess. Si al primero le asignas el valor SEE_MASK_NOCLOSEPROCESS, dejará el proceso ejecutándose y el miembro hProcess recibira el "handle" del proceso.

Luego podrás preguntar por el estado del proceso...

PS: "Handle" nunca lo he traducido. ¿Cuál se les ocurre la forma más correcta de hacerlo?

cHackAll 08-08-2007 18:04:13

Hola a todos, espero no llegar muy tarde :p


Cita:

Empezado por nosferatu177 (Mensaje 206388)
hola buenas tardes, alguien de ustedes podria decirme como hacer q se ejecute un archivo .msi en el evento onclick;es q extoy haciendo un instalador y no logro hacer q se ejecute :S, ya utilice WinExec, pero creo q solo es con los .exe; gracias de antemano

Código Delphi [-]
 WinExec('msiexec /i c:\windows\system32\sasetup.msi', SW_SHOW);

Cita:

Empezado por JULIPO (Mensaje 221437)
Pero que pasaria si ademas cuando cierre mi aplicacion, quiero saber si el programa que abri desde mi aplicacion al presionar el boton esta aun ejecutandose y si es asi cerrarlo ;

Este hilo se refiere a la ejecucion de un programa al presionar un boton;

Yo quiero saber si al cerrar mi aplicacion el programa que ejecute al presionar el boton aun esta activo y si es asi cerrarlo junto a mi aplicacion

espero sea clara la pregunta

gracias por su ayuda

Código Delphi [-]
 
...
 
implementation
 
{$R *.dfm}
 
var
 si: TStartupInfo = (cb: SizeOf(TStartupInfo));
 pi: TProcessInformation;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, si, pi);
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0;
 if not CanClose then
  MessageBox(0, 'No puedes cerrar la aplicacion hasta que cierres el Bloc de notas', nil, 0);
end;
 
end.

Saludos.

Gabo 08-08-2007 18:30:54

Con ShellExecuteEx sería así:

Código Delphi [-]
    
    SHELLEXECUTEINFO informacion;
    ZeroMemory(&informacion, sizeof(SHELLEXECUTEINFO));
    informacion.cbSize = sizeof(SHELLEXECUTEINFO);
    informacion.fMask = SEE_MASK_NOCLOSEPROCESS;
    informacion.lpVerb = "open";                           
    informacion.lpFile = "calc.exe";
    informacion.nShow = SW_SHOWMAXIMIZED;
    ShellExecuteEx(&informacion);

Y después, preguntar con WaitForSingleObject como el código de cHackAll...


La franja horaria es GMT +2. Ahora son las 22:33:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi