全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2216
推到 Plurk!
推到 Facebook!

用CreateProcess讀取Console程序的顯示和返回值

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-18 10:51:36 IP:61.218.xxx.xxx 未訂閱

用CreateProcess讀取Console程序的顯示和返回值

資料來源: http://ono.3322.org ------------------->8--------------------------------------------- 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. ------------------->8--------------------------------------------- 下載源代碼CreateProcess.zip 本站下載處:CreateProcess.zip 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/03/18 11:19:33
系統時間:2024-05-03 6:46:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!