2009-07-31 10 views

答えて

13

何このsolutionについて。


はEDIT:リンクは、この解決策につながる(軽く読みやすさのためのリファクタリングとwithの使用を削除する):

// The example runs 'chkdsk.exe c:\' and displays the output to Memo1. 
// Put a TMemo (Memo1) and a TButton (Button1) on your form. Put this 
// code in the OnCLick event procedure for Button1: 

procedure TForm1.RunDosInMemo(DosApp:String;AMemo:TMemo) ; 
const 
    ReadBuffer = 2400; 
var 
    Security : TSecurityAttributes; 
    ReadPipe, 
    WritePipe : THandle; 
    start  : TStartUpInfo; 
    ProcessInfo : TProcessInformation; 
    Buffer  : Pchar; 
    BytesRead : DWord; 
    Apprunning : DWord; 

begin 
    Security.nlength := SizeOf(TSecurityAttributes) ; 
    Security.binherithandle := true; 
    Security.lpsecuritydescriptor := nil; 
    if Createpipe (ReadPipe, WritePipe, @Security, 0) then 
    begin 
    Buffer := AllocMem(ReadBuffer + 1) ; 
    FillChar(Start,Sizeof(Start),#0) ; 
    start.cb := SizeOf(start) ; 
    start.hStdOutput := WritePipe; 
    start.hStdInput := ReadPipe; 
    start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; 
    start.wShowWindow := SW_HIDE; 
    if CreateProcess(nil, 
        PChar(DosApp), 
        @Security, 
        @Security, 
        true, 
        NORMAL_PRIORITY_CLASS, 
        nil, 
        nil, 
        start, 
        ProcessInfo) then 
    begin 
     repeat 
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100); 
     Application.ProcessMessages; 
     until (Apprunning <> WAIT_TIMEOUT) ; 
     repeat 
     BytesRead := 0; 
     ReadFile(ReadPipe,Buffer[0], 
     ReadBuffer,BytesRead,nil) ; 
     Buffer[BytesRead]:= #0; 
     OemToAnsi(Buffer,Buffer) ; 
     AMemo.Text := AMemo.text + String(Buffer) ; 
     until (BytesRead < ReadBuffer) ; 
    end; 
    FreeMem(Buffer) ; 
    CloseHandle(ProcessInfo.hProcess) ; 
    CloseHandle(ProcessInfo.hThread) ; 
    CloseHandle(ReadPipe) ; 
    CloseHandle(WritePipe) ; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject) ; 
begin 
    RunDosInMemo('chkdsk.exe c:\', Memo1) ; 
end; 
+3

素敵な提案は、以下を参照してください。http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links - 他の - 本当に良い答え – Argalatyr

+0

私はリンクからコードを投稿しました。 – Mick

+0

@Mick:あなたは新しい答えでそれをやっている間、私は古いものを編集していました。誰かが私の編集をロールバックする必要があると感じたら、気をつけてください。 – Argalatyr

2

私は通常、この移植されたFPCのコードを使用します。http://www.stack.nl/~marcov/processdelphi.zip

それは含まれてい外部プログラムを制御するクラス(これは、Lazarusがcmdlineコンパイラや他のプログラムを呼び出すために使用するクラスです)。

ドキュメントはここですが、デルファイポートは少し古いです、そうではないすべての文書のプロパティは上記のバージョンに存在している場合があります。

http://www.freepascal.org/docs-html/fcl/process/index.html

+0

これは素晴らしいですね!最近FPCのバージョンで –

+0

、最も単純なシナリオのいくつかを固定いくつかの簡単な手順は、()runCommand関数」として追加されています –

1

Tプロセスユニットを使用して、マルコの答えにほんの少しの追加は、徹底的に、私は、これはそれを行うための最も簡単な方法であると考えてい

hereを説明しています。がんばろう!リンクをたどって、それだけでリンクは本当に良い答えではない人のための

関連する問題