123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- {
- This file is part of the Free Component Library (FCL)
- Copyright (c) 1999-2000 by the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$mode objfpc}
- {$h+}
- unit process;
- interface
- Uses Classes,
- pipes,
- SysUtils;
- Type
- TProcessOption = (poRunSuspended,poWaitOnExit,
- poUsePipes,poStderrToOutPut,
- poNoConsole,poNewConsole,
- poDefaultErrorMode,poNewProcessGroup,
- poDebugProcess,poDebugOnlyThisProcess);
- TShowWindowOptions = (swoNone,swoHIDE,swoMaximize,swoMinimize,swoRestore,swoShow,
- swoShowDefault,swoShowMaximized,swoShowMinimized,
- swoshowMinNOActive,swoShowNA,swoShowNoActivate,swoShowNormal);
- TStartupOption = (suoUseShowWindow,suoUseSize,suoUsePosition,
- suoUseCountChars,suoUseFillAttribute);
- TProcessPriority = (ppHigh,ppIdle,ppNormal,ppRealTime);
- TProcessOptions = set of TProcessOption;
- TStartupOptions = set of TStartupOption;
- Type
- TProcess = Class (TComponent)
- Private
- FProcessOptions : TProcessOptions;
- FStartupOptions : TStartupOptions;
- FProcessID : Integer;
- FThreadID : Integer;
- FProcessHandle : Thandle;
- FThreadHandle : Thandle;
- FFillAttribute : Cardinal;
- FApplicationName : string;
- FConsoleTitle : String;
- FCommandLine : String;
- FCurrentDirectory : String;
- FDesktop : String;
- FEnvironment : Tstrings;
- FExitCode : Cardinal;
- FShowWindow : TShowWindowOptions;
- FInherithandles : Boolean;
- FRunning : Boolean;
- FProcessPriority : TProcessPriority;
- dwXCountchars,
- dwXSize,
- dwYsize,
- dwx,
- dwYcountChars,
- dwy : Cardinal;
- Procedure FreeStreams;
- Function GetExitStatus : Integer;
- Function GetRunning : Boolean;
- Function GetWindowRect : TRect;
- Procedure SetWindowRect (Value : TRect);
- Procedure SetShowWindow (Value : TShowWindowOptions);
- Procedure SetWindowColumns (Value : Cardinal);
- Procedure SetWindowHeight (Value : Cardinal);
- Procedure SetWindowLeft (Value : Cardinal);
- Procedure SetWindowRows (Value : Cardinal);
- Procedure SetWindowTop (Value : Cardinal);
- Procedure SetWindowWidth (Value : Cardinal);
- procedure SetApplicationName(const Value: String);
- procedure SetProcessOptions(const Value: TProcessOptions);
- procedure SetActive(const Value: Boolean);
- procedure SetEnvironment(const Value: TStrings);
- function PeekExitStatus: Boolean;
- Protected
- FInputStream : TOutputPipeStream;
- FOutputStream : TInputPipeStream;
- FStderrStream : TInputPipeStream;
- procedure CloseProcessHandles; virtual;
- Procedure CreateStreams(InHandle,OutHandle,ErrHandle : Longint);virtual;
- procedure FreeStream(var AStream: THandleStream);
- Public
- Constructor Create (AOwner : TComponent);override;
- Destructor Destroy; override;
- Procedure Execute; virtual;
- procedure CloseInput; virtual;
- procedure CloseOutput; virtual;
- procedure CloseStderr; virtual;
- Function Resume : Integer; virtual;
- Function Suspend : Integer; virtual;
- Function Terminate (AExitCode : Integer): Boolean; virtual;
- Function WaitOnExit : DWord;
- Property WindowRect : Trect Read GetWindowRect Write SetWindowRect;
- Property Handle : THandle Read FProcessHandle;
- Property ProcessHandle : THandle Read FProcessHandle;
- Property ThreadHandle : THandle Read FThreadHandle;
- Property ProcessID : Integer Read FProcessID;
- Property ThreadID : Integer Read FThreadID;
- Property Input : TOutputPipeStream Read FInputStream;
- Property Output : TInputPipeStream Read FOutputStream;
- Property Stderr : TinputPipeStream Read FStderrStream;
- Property ExitStatus : Integer Read GetExitStatus;
- Property InheritHandles : Boolean Read FInheritHandles Write FInheritHandles;
- Published
- Property Active : Boolean Read GetRunning Write SetActive;
- Property ApplicationName : String Read FApplicationName Write SetApplicationName;
- Property CommandLine : String Read FCommandLine Write FCommandLine;
- Property ConsoleTitle : String Read FConsoleTitle Write FConsoleTitle;
- Property CurrentDirectory : String Read FCurrentDirectory Write FCurrentDirectory;
- Property Desktop : String Read FDesktop Write FDesktop;
- Property Environment : TStrings Read FEnvironment Write SetEnvironment;
- Property Options : TProcessOptions Read FProcessOptions Write SetProcessOptions;
- Property Priority : TProcessPriority Read FProcessPriority Write FProcessPriority;
- Property StartupOptions : TStartupOptions Read FStartupOptions Write FStartupOptions;
- Property Running : Boolean Read GetRunning;
- Property ShowWindow : TShowWindowOptions Read FShowWindow Write SetShowWindow;
- Property WindowColumns : Cardinal Read dwXCountChars Write SetWindowColumns;
- Property WindowHeight : Cardinal Read dwYSize Write SetWindowHeight;
- Property WindowLeft : Cardinal Read dwX Write SetWindowLeft;
- Property WindowRows : Cardinal Read dwYCountChars Write SetWindowRows;
- Property WindowTop : Cardinal Read dwY Write SetWindowTop ;
- Property WindowWidth : Cardinal Read dwXSize Write SetWindowWidth;
- Property FillAttribute : Cardinal read FFillAttribute Write FFillAttribute;
- end;
-
- EProcess = Class(Exception);
- implementation
- {$i process.inc}
- Constructor TProcess.Create (AOwner : TComponent);
- begin
- Inherited;
- FProcessPriority:=ppNormal;
- FShowWindow:=swoNone;
- FInheritHandles:=True;
- FEnvironment:=TStringList.Create;
- end;
- Destructor TProcess.Destroy;
- begin
- FEnvironment.Free;
- FreeStreams;
- CloseProcessHandles;
- Inherited Destroy;
- end;
- Procedure TProcess.FreeStreams;
- begin
- If FStderrStream<>FOutputStream then
- FreeStream(FStderrStream);
- FreeStream(FOutputStream);
- FreeStream(FInputStream);
- end;
- Function TProcess.GetExitStatus : Integer;
- begin
- If FRunning then
- PeekExitStatus;
- Result:=FExitCode;
- end;
- Function TProcess.GetRunning : Boolean;
- begin
- IF FRunning then
- FRunning:=Not PeekExitStatus;
- Result:=FRunning;
- end;
- Procedure TProcess.CreateStreams(InHandle,OutHandle,ErrHandle : Longint);
- begin
- FreeStreams;
- FInputStream:=TOutputPipeStream.Create (InHandle);
- FOutputStream:=TInputPipeStream.Create (OutHandle);
- if Not (poStderrToOutput in FProcessOptions) then
- FStderrStream:=TInputPipeStream.Create(ErrHandle);
- end;
- procedure TProcess.FreeStream(var AStream: THandleStream);
- begin
- if AStream = nil then exit;
- FileClose(AStream.Handle);
- FreeAndNil(AStream);
- end;
- procedure TProcess.CloseInput;
- begin
- FreeStream(FInputStream);
- end;
- procedure TProcess.CloseOutput;
- begin
- FreeStream(FOutputStream);
- end;
- procedure TProcess.CloseStderr;
- begin
- FreeStream(FStderrStream);
- end;
- Procedure TProcess.SetWindowColumns (Value : Cardinal);
- begin
- if Value<>0 then
- Include(FStartupOptions,suoUseCountChars);
- dwXCountChars:=Value;
- end;
- Procedure TProcess.SetWindowHeight (Value : Cardinal);
- begin
- if Value<>0 then
- include(FStartupOptions,suoUsePosition);
- dwYSize:=Value;
- end;
- Procedure TProcess.SetWindowLeft (Value : Cardinal);
- begin
- if Value<>0 then
- Include(FStartupOptions,suoUseSize);
- dwx:=Value;
- end;
- Procedure TProcess.SetWindowTop (Value : Cardinal);
- begin
- if Value<>0 then
- Include(FStartupOptions,suoUsePosition);
- dwy:=Value;
- end;
- Procedure TProcess.SetWindowWidth (Value : Cardinal);
- begin
- If (Value<>0) then
- Include(FStartupOptions,suoUseSize);
- dwXSize:=Value;
- end;
- Function TProcess.GetWindowRect : TRect;
- begin
- With Result do
- begin
- Left:=dwx;
- Right:=dwx+dwxSize;
- Top:=dwy;
- Bottom:=dwy+dwysize;
- end;
- end;
- Procedure TProcess.SetWindowRect (Value : Trect);
- begin
- Include(FStartupOptions,suoUseSize);
- Include(FStartupOptions,suoUsePosition);
- With Value do
- begin
- dwx:=Left;
- dwxSize:=Right-Left;
- dwy:=Top;
- dwySize:=Bottom-top;
- end;
- end;
- Procedure TProcess.SetWindowRows (Value : Cardinal);
- begin
- if Value<>0 then
- Include(FStartupOptions,suoUseCountChars);
- dwYCountChars:=Value;
- end;
- procedure TProcess.SetApplicationName(const Value: String);
- begin
- FApplicationName := Value;
- If (csDesigning in ComponentState) and
- (FCommandLine='') then
- FCommandLine:=Value;
- end;
- procedure TProcess.SetProcessOptions(const Value: TProcessOptions);
- begin
- FProcessOptions := Value;
- If poNewConsole in FProcessOptions then
- Exclude(FProcessOptions,poNoConsole);
- if poRunSuspended in FProcessOptions then
- Exclude(FProcessOptions,poWaitOnExit);
- end;
- procedure TProcess.SetActive(const Value: Boolean);
- begin
- if (Value<>GetRunning) then
- If Value then
- Execute
- else
- Terminate(0);
- end;
- procedure TProcess.SetEnvironment(const Value: TStrings);
- begin
- FEnvironment.Assign(Value);
- end;
- end.
|