Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar programa externo com parametros (https://www.clubdelphi.com/foros/showthread.php?t=92557)

DarkSton 27-11-2017 12:45:31

Ejecutar programa externo com parametros
 
Hola amigos ,mi pregunta es como ejecutar un programa desde delphi con parametros.
Un ejemplo que dijero para hacerlo desde escritorio "acceso directo" es crear un acceso directo del programa al escritorio y editar en la ruta
"c:/prueba/prueba.exe parametro1 parametro2 parametro3"
Bueno asi me dieron el ejemplo pero quiero hacerlo desde delphi .
Ayuden :)

Casimiro Notevi 27-11-2017 13:03:17

Mira los enlaces de final de página, abajo del todo.

Neftali [Germán.Estévez] 29-11-2017 13:36:58

O busca en la ayuda del foro sobre ShellExecute.
Te saldrán bastantes ejemplos de cómo hacerlo.

fracapa 09-04-2019 11:22:32

Problema con ShellExecute
 
Hola:

Yo también tengo un problema con ShellExecute, es a la hora de llamar a AutoFirmaCommandLine.exe para firmar un pdf con el certificado electrónico.

Si ejecuto esto desde cmd o desde un .bat, me genera bien el fichero
C:\AutoFirma\AutoFirmaCommandLine.exe sign -i c:\fichero_origen.pdf -o c:\fichero_firmado.pdf -format pades -store auto -alias "ALIAS DEL CERTIFICADO"

Pero con ShellExecute no va. He probado a meter la linea a piñon en el .bat y solo llamar al .bat, tambien he probado a pasarle los parametros y tampoco...

Estoy usando la ultima version de AutoFirma y Delphi 6 (casi nada.....)
Alguna idea?

Gracias y un saludo.

Casimiro Notevi 09-04-2019 12:18:01

"No va", no nos dice nada, no podemos ayudarte con solamente esa explicación.
Por favor, no olvides revisar nuestra guía de estilo, gracias.

Neftali [Germán.Estévez] 09-04-2019 12:40:54

A parte de lo comentado por [Casimiro], a veces hay que tener en cuenta otros temas como:
  • El directorio desde dónde se ejecuta en una caso y otro (lo que sería el directorio activo)
  • El tema de permisos en un caso y otro
  • El PATH en un caso y otro
  • ...

newtron 09-04-2019 13:32:18

Hola.


Yo en su día quiero recordar que también tuve algún problema con "ShellExecute" y lo que hice fue llamarlo con una función que no recuerdo de dónde la saqué pero es la siguiente:


Código Delphi [-]

function EjecutarYEsperar( sPrograma: String; Visibilidad: Integer ): Integer;
var
  sAplicacion: array[0..512] of char;
  DirectorioActual: array[0..255] of char;
  DirectorioTrabajo: String;
  InformacionInicial: TStartupInfo;
  InformacionProceso: TProcessInformation;
  iResultado, iCodigoSalida: DWord;
begin
  StrPCopy( sAplicacion, sPrograma );
  GetDir( 0, DirectorioTrabajo );
  StrPCopy( DirectorioActual, DirectorioTrabajo );
  FillChar( InformacionInicial, Sizeof( InformacionInicial ), #0 );
  InformacionInicial.cb := Sizeof( InformacionInicial );

  InformacionInicial.dwFlags := STARTF_USESHOWWINDOW;
  InformacionInicial.wShowWindow := Visibilidad;
  CreateProcess( nil, sAplicacion, nil, nil, False,
                 CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                 nil, nil, InformacionInicial, InformacionProceso );

  // Espera hasta que termina la ejecución
  repeat
    iCodigoSalida := WaitForSingleObject( InformacionProceso.hProcess, 1000 );
    Application.ProcessMessages;
  until ( iCodigoSalida <> WAIT_TIMEOUT );

  GetExitCodeProcess( InformacionProceso.hProcess, iResultado );
  MessageBeep( 0 );
  CloseHandle( InformacionProceso.hProcess );
  Result := iResultado;
end;


Para hacer la llamada solo tienes que enviar en sPrograma la cadena completa y en Visibilidad yo envío 0 aunque no recuerdo para qué era ese parámetro, imagino que para que se visualice o no el programa al que llamas.


Saludos

ecfisa 09-04-2019 19:07:26

Hola fracapa.

Todo lo referente a la función ShellExecute lo encontrarás [aquí].

La función devuelve un resultado que, de fallar el llamado, podes revisar para ver cuál es el problema .

Un ejemplo:
Código Delphi [-]
uses ShellApi;
...
var
  lpOperation : PChar;
  lpFile      : PChar;
  lpParameters: PChar;
  lpDirectory : PChar;
  nShowCmd    : Integer;
  RetValue    : Integer;
begin
  lpOperation  := 'open';
  lpFile       := 'NOTEPAD.EXE';
  lpParameters := 'C:\WINDOWS\WIN.INI';
  lpDirectory  := 'C:\WINDOWS';
  nShowCmd     := SW_NORMAL;

  RetValue     := ShellExecute(Handle,
                               lpOperation,
                               lpFile,
                               lpParameters,
                               lpDirectory,
                               nShowCmd);

  if  RetValue <= 32 then
    ShowMessage(SysErrorMessage(GetLastError())); // (*)
end;
(*) También podrías evaluar el valor de retorno mediante la declaración if o case en lugar de la función GetLastError.

El ejemplo admite varias optimizaciones ya que prioricé la didactica sobre la eficiencia.


Saludos :)

fracapa 10-04-2019 13:47:18

Hola:

Cuando solo puse que no iba, era porque no tenia mas información, y la aplicación no me devolvía nada.

Todos los parámetros, rutas, etc etc estaban bien.

La función de Ejecutar y Esperar ya la había probado y no me funcionaba.

El problema es que a la aplicación le cuesta arrancar un poco, comprueba si hay lectores de DNIe, almacenes de certificados, etc etc y después realiza la firma con el pdf.

Use la función de abajo usando como condición de salida <> STILL_ACTIVE y quitando or Application.Terminated, porque el ShellExecuteEx lanza la aplicación que se le pasa y salia por el Terminated.
Código Delphi [-]
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0) ;
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);

  SEInfo.fMask       := SEE_MASK_NOCLOSEPROCESS;
  SEInfo.Wnd         := Application.Handle;
  SEInfo.lpFile      := PChar(sFichero_Aplicacion);
  SEInfo.lpParameters:= PChar(sParametros);
  SEInfo.nShow       := SW_HIDE;

  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
    until (ExitCode <> STILL_ACTIVE); // or Application.Terminated;
  end
  else
    showmessage('Error') ;
end;
Gracias por todo y un saludo

Ñuño Martínez 11-04-2019 10:35:33

Cita:

Empezado por fracapa (Mensaje 531412)
Hola:

Cuando solo puse que no iba, era porque no tenia mas información, y la aplicación no me devolvía nada.

Todos los parámetros, rutas, etc etc estaban bien.

La función de Ejecutar y Esperar ya la había probado y no me funcionaba.

Buenas fracapa:

En los casos en los que la aplicación no funciona y "no devuelve nada", lo que hay que hacer es usar el depurador para vigilar el contenido de variables y ejecutar paso a paso las partes importantes del código para ver qué pasa realmente. Busca información sobre el funcionamiento del depurador de Delphi (que es bastante bueno) o de GDB (aunque ahora no recuerdo si puede usarse con Delphi); sigue algún tutorial y verás cómo ayuda.


La franja horaria es GMT +2. Ahora son las 00:15:14.

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