Delphi - ShellExecute

 
Vista:

ShellExecute

Publicado por Oscar (18 intervenciones) el 09/04/2009 17:31:47
Hola a todos,

Alguien que me pueda ayudar. Como puedo realizar una pausa cuando el ShellExecute se está ejecutando, dado que cuando esta en ejecución realiza una llamado a una aplicación externa pero sigue ejecutando las líneas de programa que vienen a continuación.
Necesito esperar a que termine el ShellExecute antes de seguir, como lo hago?

Ocupe el WaitForSingleObject pero no me resulta, que estoy haciendo mal??, se puede hacer??

Ejecuta Procedure Nro 1;

ShellExecute( Self.Handle,'OPEN',PChar( 'xx'), 'xx', Nil, SW_SHOWMINIMIZED);

{Esperamos que termine el ShellExecute para continuar con Procedure Nro. 2, aqui no se como se espera a que termine, hoy sigue y ejecuta Procedure 2 mientras se está ejecutando el ShellExecute.}

repeat
exitCode := WaitForSingleObject( tpi.hProcess ,1000);
Application.ProcessMessages;
until (exitCode <> 1000);

Ejecuta Procedure Nro 2;

Muchas gracias a quien me pueda ayudar.

Saluos.
Oscar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:ShellExecute

Publicado por E.T. (1244 intervenciones) el 10/04/2009 18:04:07
Probaste otra forma a parte de shellexecute?

http://www.clubdelphi.com/foros/showthread.php?t=13422&highlight=WaitForSingleObject

http://www.ajpdsoft.com/modules.php?name=Content&pa=showpage&pid=203
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 10/04/2009 18:46:43
En realidad probé con winexecute pero pasa lo mismo , traté de implementar lo que me indicas en las ( http://) pero no me resultó ,lo más probable es que este haciendo al go mal, volvere a intentar.

Se gradece mucho la respuesta.

Saludos
Oscar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 13/04/2009 18:46:30
Hola E.T.,

Muchas gracias por tu respuesta, te cuento que intenté nuevamente de realizar el ejercicio pero no me resulta. Te cuento que el ejemplo que me indicaste funciona perfecto cuando se trata de una aplicación, sin embargo yo necesito además de ejcutar la aplcación pasar un parámetro a esta aplicación y este no me lo reconoice me da error.

De antemano se agradece cualquier ayuda.

**********************************************************
EJEMPLO QUE ME INDICASTE
*********************************************************
function ExecuteProcess(ProcessName: String): Cardinal;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;

begin
Result := 0;

FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);

if CreateProcess(
PChar(ProcessName), nil, nil, nil, false, 0,
nil, nil, StartInfo, ProcInfo)
then
Result := ProcInfo.hProcess;

///Hasta ahí funciona perfecto

//****************************************************************
//MI CÓDIGO QUE NECESITO IMPLEMENTAR EN EJEMPLO
//EN EL IF CREATEPROCESS
//********************************************************************
//Yo ocupo el
//ShellExecute( Self.Handle,'OPEN',PChar( 'xx'), 'xx', Nil, SW_SHOWMINIMIZED);

//DONDE PCHAR('XX') ES LA APLICACIÓN .EXE que necesito levantar.
// ',xx', es el parámetro que necesito pasar a la aplicación.

//esto no me resulta, intenté con cambiándolo con lo que me indicaste en el CreateProcess

// PChar(ProcessName), parametro, nil, nil, false, 0,
// nil, nil, StartInfo, ProcInfo)

// PChar(ProcessName), PChar(parametro), nil, nil, false, 0,
// nil, nil, StartInfo, ProcInfo)

// No me resultó y no sé como se hace.
// Si me puedes contestar y ayudar lo agradezco mucho. Gracias.

end;

Procedure EjecutayEspera
var
Process: Cardinal;

begin
Application.Minimize;

Process := ExecuteProcess('c:windows otepad.exe');
if Process <> 0 then
WaitForSingleObject(Process, INFINITE);

Application.Restore;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:ShellExecute

Publicado por E.T. (1244 intervenciones) el 13/04/2009 19:24:49
Yo envio parámetros junto con el nombre del archivo, algo como esto

// PChar(ProcessName+parametro), nil, nil, nil, false, 0,
// nil, nil, StartInfo, ProcInfo)

// PChar('c: otepad.exe "c: exto.txt"'), nil, nil, nil, false, 0,
// nil, nil, StartInfo, ProcInfo)

Checa que la ruta del programa a llamar no lleva comillas(comillas dobles), y el parámetro si las lleva

'c: otepad.exe "c: exto.txt"'

además la la aplicación y el parámetro son separados por un espacio, intentalo así, haber si funciona
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 13/04/2009 21:43:45
Estimado E.T.,

Textual:

function TfrmMain.ExecuteProcess( ProcessName, ParameterName : String ) : Cardinal;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
begin
Result := 0;

FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);

if CreateProcess( PChar( ' ProcessName "ParameterName" ' ),nil ,nil , nil, false, 0, nil, nil, StartInfo, ProcInfo)
then
Result := ProcInfo.hProcess;
end;

procedure TfrmMain.btnInyectaClick(Sender: TObject);
var
Process: Cardinal;
cAplicacion : string;
begin

cAplicacion := 'C:Aplicacion.exe';
cParametro :='C:Fparametro.txt'

Procedure1() ;

Process := ExecuteProcess( cAplicacion, cParametro );
if Process <> 0 then
WaitForSingleObject(Process, INFINITE);

Procedure2();

end;

*****************************************************************************
LLAME TAMBIEN DE ESTA FORMA ESCRIBIENDO DIRECTAMENTE
y NO ME RESULTA, el programa no realiza la pausa y ejecuta procedure 2
****************************************************************************

if CreateProcess( PChar( ProcessName + ' "C:Fparametro.TXT" ' ),nil ,nil , nil, false, 0, nil, nil, StartInfo, ProcInfo)

if CreateProcess( PChar( 'C:APLICACION.EXE "C:Fparametro.TXT" ' ),nil ,nil , nil, false, 0, nil, nil, StartInfo, ProcInfo)

if CreateProcess( PChar( ProcessName + ParameterName ),nil ,nil , nil, false, 0, nil, nil, StartInfo, ProcInfo)

if CreateProcess( PChar( ProcessName +' '+ ParameterName ),nil ,nil , nil, false, 0, nil, nil, StartInfo, ProcInfo)

QUE ESTOY HACIENDO MAL, ????......Muchas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:ShellExecute

Publicado por E.T. (1244 intervenciones) el 13/04/2009 23:25:27
Recien probado, solo habia que cambiar los parámetros de "CreateProcess"

function ExecuteProcess(ProcessName: String): Cardinal;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;

begin
Result := 0;

FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);

if CreateProcess(nil, PChar(ProcessName), nil, nil, false, 0,
nil, nil, StartInfo, ProcInfo)
then
Result := ProcInfo.hProcess;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Process: Cardinal;

begin
Application.Minimize;

Process := ExecuteProcess('c:windowssystem32 otepad.exe c:ftp.txt');
if Process <> 0 then
WaitForSingleObject(Process, INFINITE);

Application.Restore;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 14/04/2009 00:18:40
Grande Maestro E.T.!!!!!

Funciona impecable,claro!!! ahora se dispara como una línea de comando....excelente.......MUCHISIMAS GRACIAS......... gran aporte!!!!!!!

Sólo una duda más ,como hago para que el "CreateProcess(nil, PChar(ProcessName), nil, nil, false, 0, nil, nil, StartInfo, ProcInfo) ", ejecute la aplicación minimizada, es decir, la aplicación que se llama en "ProcessName", esto porque com Application.Minimize, minimiza toda la aplicación principal e incluye la aplicación que se llama en CreateProcess, sólo necesito que se ejecute minimizada la aplicación que se llama en ProcessName y la principal que se siga viendo en pantalla.

Nuevamente muchas gracias por todo y si puedes me contestas.

Saludos
Agradecido

Oscar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:ShellExecute

Publicado por E.T. (1244 intervenciones) el 14/04/2009 00:55:07
mmm... tardé un poco en encontrarlo, pero si se puede, en una pagina que ya he recomendado antes

http://delphiallimite.blogspot.com/2007/06/ejecutar-un-programa-y-esperar-que.html

function ExecuteProcess(ProcessName: String): Cardinal;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;

begin
Result := 0;

FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);
StartInfo.dwFlags:= STARTF_USESHOWWINDOW;
StartInfo.wShowWindow:=SW_SHOWMINIMIZED;
if CreateProcess(nil, PChar(ProcessName), nil, nil, false, 0,
nil, nil, StartInfo, ProcInfo)
then
Result := ProcInfo.hProcess;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Process: Cardinal;

begin
Process := ExecuteProcess('c:windowssystem32 otepad.exe c:ftp.txt');
if Process <> 0 then
WaitForSingleObject(Process, INFINITE);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 14/04/2009 14:56:41
Grande Gurú !!!! extraordinario.....

Excelente dato , sólo me queda dar las infinitas gracias a sus grandes y valiosos aportes, así como también su muy buena voluntad de ayudar a un despistado!!!

MUCHAS GRACIAS E.T. :-D

Saludos.
Oscar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Ingeniero (17 intervenciones) el 24/04/2009 17:09:15
...Amigo "Oscar", te recomiendo que utilices la instruccion ShellExecute dentro de Try...Finally o Try...Except. O bien, si prefieres, puedes utilizar un contador inmediatamente despues de la instruccion (con For to); si utilizas Try...Finally dentro de Finally metes el codigo que sigue a la instruccion...

Saludos Cordiales...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:ShellExecute

Publicado por Oscar (18 intervenciones) el 24/04/2009 17:42:29
Hola,

Muchísimas gracias por tu valioso aporte , te cuento que ya pude hacer lo que necesitaba sin embargo probaré con lo que me indicas así podré tener otra alternativa a la hora de seguir desarrollado.

Muchas gracias.....saludos.

Agradecido.

Oscar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar