2,498
社区成员
发帖
与我相关
我的任务
分享
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;
procedure TForm1.btn1Click(Sender: TObject);
var
strOut: string;
begin
GetRunConsoleResult('help.exe', SW_HIDE, strOut);
mmo1.Text := strOut;
end;