unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; OpenDialog1: TOpenDialog; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations }
function WinExecAndWait32(FileName:String;Visibility:Integer;var mOutputs:string):Cardinal; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm} function TForm1.WinExecAndWait32(FileName:String;Visibility:Integer;var mOutputs:string):Cardinal; var sa:TSecurityAttributes; hReadPipe,hWritePipe:THandle; ret:BOOL; strBuff:array[0..255] of char; lngBytesread:DWORD; WorkDir:String; StartupInfo:TStartupInfo; ProcessInfo:TProcessInformation; begin FillChar(sa,Sizeof(sa),#0); sa.nLength := Sizeof(sa); sa.bInheritHandle := True; sa.lpSecurityDescriptor := nil; ret := CreatePipe(hReadPipe, hWritePipe, @sa, 0);
WorkDir:=ExtractFileDir(Application.ExeName); FillChar(StartupInfo,Sizeof(StartupInfo),#0); StartupInfo.cb:=Sizeof(StartupInfo); StartupInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; StartupInfo.wShowWindow:=Visibility;
StartupInfo.hStdOutput:=hWritePipe; StartupInfo.hStdError:=hWritePipe;
if not CreateProcess(nil, PChar(FileName), { pointer to command line string } @sa, { pointer to process security attributes } @sa, { pointer to thread security attributes } True, { handle inheritance flag } // CREATE_NEW_CONSOLE or { creation flags } NORMAL_PRIORITY_CLASS, nil, { pointer to new environment block } PChar(WorkDir), { pointer to current directory name, PChar} StartupInfo, { pointer to STARTUPINFO } ProcessInfo) { pointer to PROCESS_INF } then Result := INFINITE {-1} else begin // Form1.Hide; // FileOpen(FileName,fmShareExclusive); // SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); ret:=CloseHandle(hWritePipe); mOutputs:=''''''''; while ret do begin FillChar(strBuff,Sizeof(strBuff),#0); ret := ReadFile(hReadPipe, strBuff, 256, lngBytesread, nil); mOutputs := mOutputs + strBuff; end;
Application.ProcessMessages; WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); CloseHandle(ProcessInfo.hProcess); { to prevent memory leaks } CloseHandle(ProcessInfo.hThread); // Form1.Close; { exit application } ret := CloseHandle(hReadPipe); end; end;
procedure TForm1.Button1Click(Sender: TObject); var Val:Cardinal; mOutputs:string; i:integer; begin Val:=WinExecAndWait32(Edit1.Text,SW_SHOWNORMAL,mOutputs); Memo1.Lines.Add(''''******Result******''''+#13#10+IntToStr(Val)); i:=1; while i<=length(mOutputs) do begin if mOutputs[i]=#10 then begin Insert(#13,mOutputs,i); i:=i+2; end else Inc(i); end; Memo1.Lines.Add(''''******Echo******''''+#13#10+mOutputs); end;
procedure TForm1.Button2Click(Sender: TObject); begin OpenDialog1.InitialDir:=ExtractFilePath(ParamStr(0)); if OpenDialog1.Execute then Edit1.Text:=Opendialog1.FileName; end;
end.
源代码下载
[SyBase]How to use rar in console on linux.
|