Read the display information of the console program with CreateProcess, and return results

zhaozj2021-02-17  52

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; VAR Moutputs: string): cardinal; public {public declarations}

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 (STRBUF), # 0); RET: = Readfile (Hreadpipe, Strbuff, 256, LN gBytesread, 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;

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 INTOSTR (VAL)); i: = 1; While I <= length (moutputs) do beg If moutputs [i] = # 10 the 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.

Source code download

转载请注明原文地址:https://www.9cbs.com/read-30262.html

New Post(0)