PDA

Ver la Versión Completa : Ejecutar programa externo com parametros


DarkSton
27-11-2017, 12:45:31
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
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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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:




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í (https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shellexecutea)].

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

Un ejemplo:

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 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx).

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.

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