2010-11-28 9 views
5

コマンドラインパラメータでプログラムを実行しました。どのように私はそれが実行を終了するのを待つことができますか?コマンドラインプログラムが終了するのを待つ方法はありますか?

+0

のために非常に明確であるか疑問言うカントは、私の... CLIの入力は 'stdin'から来て、' output'は 'stdout'(場合によっては' stderr')に行きます。プログラムの振る舞いの修飾子として機能するパラメータ –

+0

現在のフォームが非常に不明なため、質問に言い換えてください。何を待っていますか?実行されたプログラムのコンソール出力?そのプログラムから送信されたWindowsメッセージ? –

+0

私の悪い英語を申し訳ありません!私は答えを見つけた。あなたはページの下部にそれを見ることができます! – Kermia

答えて

11

これが私の答えされています(すべてのいただきありがとうございます)

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()の代わりにMsgWaitForMultipleObjects()を使用して、Application.ProcessMessages()を不必要に呼び出さないようにしてください。頻繁に行うと、ループ実行中にアプリのパフォーマンスが低下する可能性があります。 –

+0

私はスレッドでそれを使用します!したがって、アプリケーション。ProcessMessages;削除されます! – Kermia

+0

MsgWaitForMultipleObjectsは実際にはより良い解決策になりそうです。あなたがそうしたら、スレッドを待つだけです! –

2

[OK]を、コマンドラインパラメータを取得し、あなたは

ParamCountを使用:コマンドライン上のプログラムに渡されたパラメータの数を返します。

ParamStr:インデックスによって要求される特定のパラメータを返します。 今Running Dephi Applications With Parameters

、何を意味すると読み、コンソールに書き込みを行っている場合、あなたは

WriteLnを使用するには:コンソールへのテキストの行を書き込みます。

ReadLn:コンソールから文字列として1行のテキストを読み込みます。 Delphi Basics

2

コマンドライン実行可能ファイルを実行し、このexeがコンソールに書き込む応答を取得するのが最も簡単な方法は、バッチファイルからexeファイルを呼び出し、出力を別のファイルにリダイレクトすることですファイル>を使用して、そのファイルを読み取ります。

たとえば、あなたは「DIR」コマンドを実行し、その出力を取得する必要がある場合は、次のものが含まgetdir.batというバッチファイルを持つことができ:

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

をあなたはAPIを使用して、そのバッチファイルをexecしことができは関数ShellExecute。あなたは

http://delphi.about.com/od/windowsshellapi/a/executeprogram.htmそれについて次にあなたもTStringListのようなものを使用して、出力ファイルを読むことができますを読むことができます:

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

私が正しくあなたの質問を理解していれば、あなたはコマンドラインでプログラムを実行し、そのをキャプチャしたいですコンソールウィンドウではなくアプリケーションで出力します。これを行うには、pipesを使用して出力を読み取ることができます。ここでは例のソースコードは次のとおりです。

Capture the output from a DOS (command/console) Window

4

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-Hi!私はDSIWin32 v1.70bを持っています - これはベータ版ですか? – Ampere

+0

@ gabr-そして別の質問です。出力をキャプチャしている間、アプリケーションはフリーズします。キャプチャされた出力を動的に表示する方法があります。 – Ampere

関連する問題