2010-11-28 21 views
5

Komut satırı parametreleriyle programı çalıştırıyorum. Çalışmayı bitirmesi için nasıl bekleyebilirim?Komut satırı programının tamamlanması için nasıl bekleyebilirim?

+0

için çok açıktır Hangi soru söyleyemem İşte bir örnek kaynak kodu ben ... CLI 'girişi için' stdin 'gelir ve' çıktı' 'stdout’a (veya bazı durumlarda stderr') gider. Program davranışı için değiştirici olarak işlev gören parametreler –

+0

Lütfen geçerli formun çok açık olmadığı için lütfen sorunuzu yeniden yazın. Ne için bekliyorsun? Uygulanan programın konsol çıkışı? Bu program tarafından gönderilen Windows mesajları? –

+0

Kötü ingilizcem için özür dilerim! cevabı buldum. Bunu sayfanın altında görebilirsiniz! – Kermia

cevap

11

Bu

cevabım ise: (teşekkür ederiz)

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

WaitForSingleObject() yerine MsgWaitForMultipleObjects() kullanmalısınız, böylece Application.ProcessMessages() gereksiz yere çağırılmaz. Çok sık yapmak, döngü çalışırken uygulamanın performansını düşürebilir. –

+0

Bunu bir iş parçacığında kullanacağım! UygulamaProcessMessages; silinecek ! – Kermia

+0

MsgWaitForMultipleObjects gerçekten daha iyi bir çözüm olması muhtemeldir - sadece bu şekilde yaptıysanız sadece iş parçacığı için beklemek zorunda kalacaksınız! –

2

Ok, komut satırı parametrelerini almak sen

ParamCount kullanın: komut satırında program geçirilen parametrelerin sayısını döndürür.

ParamStr: dizine göre istenen belirli bir parametreyi döndürür. konsola metin satırı yazıyor: ne demek okuma ve konsola yazıyor eğer Running Dephi Applications With Parameters

Şimdi,

WriteLn kullanın.

ReadLn: Konsoldaki bir metin dizesini bir dize olarak okur. Ne istediğiniz bir komut satırı yürütülebilir yürütmek ve bu exe konsola yazar olduğunu yanıt almak için ise Delphi Basics

2

, en kolay yolu bir toplu iş dosyasından exe arayıp diğerine çıkışını yönlendirmek olabilir > kullanarak dosya ve sonra bu dosyayı okuyun.

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

API kullanarak bu toplu iş dosyasını exec olabilir: Eğer "dir" komutunu çalıştırmak ve çıkışını almak gerekirse

Örneğin, aşağıdaki içerdiğini getdir.bat adlı bir toplu iş dosyası var olabilir ShellExecute işlevi. Sen Sonra hatta bir TStringList gibi bir şey kullanarak, çıktı dosyasını okuyabilir o http://delphi.about.com/od/windowsshellapi/a/executeprogram.htm

okuyabilirsiniz: Sorunuzu doğru anlamak

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

DSiWin32 kullanma:

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

@ gabr-Hi! DSIWin32 var v1.70b - Bu bir beta sürümü var mı? – Ampere

+0

@ gabr-Ve başka bir soru. Çıkış yakalandığında uygulama donuyor. Yakalanan çıktıyı dinamik olarak göstermenin bir yolu var. – Ampere