2010-11-28 8 views
5

He ejecutado un programa con parámetros de línea de comandos. ¿Cómo puedo esperar para que termine de ejecutarse?¿Cómo puedo esperar a que termine un programa de línea de comandos?

+0

No puedo decir lo que pregunta es muy clara para yo ... para CLI 'input' viene de' stdin' y 'output' va a' stdout' (o 'stderr' en algunos casos). parámetros que actúan como modificadores del comportamiento del programa –

+0

Por favor, reformule su pregunta, ya que el formulario actual no está muy claro. ¿Que estas esperando? ¿Salida de consola del programa ejecutado? Mensajes de Windows enviados por ese programa? –

+0

¡Perdón por mi mal inglés! encontré la respuesta. ¡puedes ver eso en la parte inferior de la página! – Kermia

Respuesta

11

Esta es mi respuesta: (Gracias a todos)

uses ShellAPI; 

function TForm1.ShellExecute_AndWait(FileName: string; Params: string): bool; 
var 
    exInfo: TShellExecuteInfo; 
    Ph: DWORD; 
begin 

    FillChar(exInfo, SizeOf(exInfo), 0); 
    with exInfo do 
    begin 
    cbSize := SizeOf(exInfo); 
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; 
    Wnd := GetActiveWindow(); 
    exInfo.lpVerb := 'open'; 
    exInfo.lpParameters := PChar(Params); 
    lpFile := PChar(FileName); 
    nShow := SW_SHOWNORMAL; 
    end; 
    if ShellExecuteEx(@exInfo) then 
    Ph := exInfo.hProcess 
    else 
    begin 
    ShowMessage(SysErrorMessage(GetLastError)); 
    Result := true; 
    exit; 
    end; 
    while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do 
    Application.ProcessMessages; 
    CloseHandle(Ph); 

    Result := true; 

end; 
+3

Debe usar MsgWaitForMultipleObjects() en lugar de WaitForSingleObject() para que no llame innecesariamente a Application.ProcessMessages(). Hacerlo con demasiada frecuencia puede degradar el rendimiento de su aplicación mientras se ejecuta su ciclo. –

+0

¡Lo usaré en un hilo! entonces aplicaciónProcessMessages; removerá ! – Kermia

+0

MsgWaitForMultipleObjects realmente es la mejor solución, ¡solo tendrá que esperar el hilo si lo hizo de esa manera! –

2

Ok, obtener los parámetros de línea de comandos, se utiliza

ParamCount: Devuelve el número de parámetros pasados ​​al programa en la línea de comandos.

ParamStr: devuelve un parámetro específico, solicitado por el índice. Running Dephi Applications With Parameters

Ahora, si lo que quiere decir es leer y escribir en la consola, se utiliza

WriteLn: escribe una línea de texto a la consola.

ReadLn: lee una línea de texto de la consola como una cadena. Delphi Basics

2

Si lo que desea es ejecutar un ejecutable de línea de comandos y obtener la respuesta que este exe escribe en la consola, la forma más fácil podría ser llamar al archivo ejecutable y redirigir el resultado a otro archivo usando >, y luego lea ese archivo.

Por ejemplo, si tiene que ejecutar el comando "dir" y obtener su salida que podría tener un archivo por lotes llamado getdir.bat que contiene lo siguiente:

@echo off 
dir c:\users\myuser\*.* > output.txt 

que podría exec ese archivo por lotes mediante la API función ShellExecute. Usted puede leer sobre él http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm

continuación, puede leer el archivo de salida, incluso con algo así como un TStringList:

var 
    output: TStringList; 
begin 
    output := TStringList.Create(); 
    output.LoadFromFile('output.txt'); 
    ... 
4

Usando DSiWin32:

sl := TStringList.Create; 
if DSiExecuteAndCapture('cmd.exe /c dir', sl, 'c:\test', exitCode) = 0 then 
    // exec error 
else 
    // use sl 
sl.Free; 
+0

@ gabr-Hola! Tengo DSIWin32 v1.70b - ¿Es esta una versión beta? – Ampere

+0

@ gabr-Y otra pregunta. La aplicación se congela mientras captura la salida. Hay una manera de mostrar dinámicamente la salida capturada. – Ampere

Cuestiones relacionadas