- function GetRunConsoleResult(FileName:String;Visibility:Integer;var mOutputs:string):Integer;
- 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;
- if not(CreatePipe(hReadPipe, hWritePipe, @sa, 0)) then
- begin
- Result:=-2; //通道创建失败
- end;
- 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 }
- 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
- 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;
- //等待console结束
- WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
- GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
- CloseHandle(ProcessInfo.hProcess); { to prevent memory leaks }
- CloseHandle(ProcessInfo.hThread);
- CloseHandle(hReadPipe);
- end;
- end;
调用方式:
- GetRunConsoleResult(执行文件,SW_SHOWNORMAL,返回字符串); //函数执行成功返回 0