
function RunConsolApp(const cmd: string): string; var StartupInfo: TStartupInfo; ProcessInformation: TProcessInformation; SecurityAttributes: TSecurityAttributes; hReadPipe, hWritePipe,hReadError,hWriteError: THandle; Buffer,ErrorBuffer: array [1..4096] of char; dwRead,dwReadError: integer; dwExitCode:dword; dwBytesAvail,dwBytesRead,dwBytesReadError:cardinal; begin fillchar(SecurityAttributes, SizeOf(TSecurityAttributes), 0); SecurityAttributes.nLength := sizeof(TSecurityAttributes); SecurityAttributes.lpSecurityDescriptor := nil; SecurityAttributes.bInheritHandle := true; if CreatePipe(hReadPipe, hWritePipe, @SecurityAttributes,0) then begin CreatePipe(hReadError, hWriteError, @SecurityAttributes,0); fillchar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := sizeof(TStartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.hStdOutput := hWritePipe; StartupInfo.hStdError:=hWriteError; Result:=''; if CreateProcess(nil,pChar(cmd),nil,nil,true,NORMAL_PRIORITY_CLASS, nil,nil,StartupInfo,ProcessInformation) then begin repeat repeat if PeekNamedPipe(hReadPipe,nil,0,nil,@dwBytesRead,nil) then if dwBytesRead>0 then begin if ReadFile(hReadPipe,Buffer,sizeof(buffer), dwBytesRead,NIL) then begin result:=Result+Copy(buffer,0,dwBytesRead); Application.ProcessMessages; end; end; until dwBytesRead=0; repeat if PeekNamedPipe(hReadError,nil,0,nil,@dwBytesRead,nil) then if dwBytesRead>0 then begin if ReadFile(hReadError,Buffer,sizeof(buffer), dwBytesRead,NIL) then begin result:=Result+Copy(buffer,0,dwBytesRead); Application.ProcessMessages; end; end; until dwBytesRead=0; WaitForSingleObject(ProcessInformation.hProcess,0); GetExitCodeProcess(ProcessInformation.hProcess,dwExitCode); until dwexitcode<>still_active; CloseHandle(hReadPipe); CloseHandle(hReadError); CloseHandle(ProcessInformation.hProcess); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin memo1.Text := RunConsolApp(Edit1.Text); end;
Yorumlar