获取cmd返回的结果

发布时间 2023-09-04 11:00:52作者: Tag
procedure RunMSDOS(Str: string);
var
  Command: string;
  Output: string;
  Buffer: array[0..255] of Char;
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  BytesRead: DWORD;
begin
  Command := Str;

  FillChar(Security, SizeOf(TSecurityAttributes), 0);
  Security.nLength := SizeOf(TSecurityAttributes);
  Security.bInheritHandle := True;
  Security.lpSecurityDescriptor := nil;


  if CreatePipe(ReadPipe, WritePipe, @Security, 0) then
  begin
    try
      ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
      StartupInfo.cb := SizeOf(TStartupInfo);
      StartupInfo.hStdOutput := WritePipe;
      StartupInfo.hStdError := WritePipe;
      StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_HIDE;

      if CreateProcess(nil, PChar('cmd.exe /C ' + Command), nil, nil, True, CREATE_NO_WINDOW, nil, nil, StartupInfo, ProcessInfo) then
      begin
        try
          CloseHandle(WritePipe);
          Output := '';

          repeat
            if ReadFile(ReadPipe, Buffer, 255, BytesRead, nil) then
            begin
              Buffer[BytesRead] := #0;
              Output := Output + Buffer;
            end
            else
              Break;
          until BytesRead = 0;
            form1.mmo1.Lines.add(Output);
        finally
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
        end;
      end;
    finally
      CloseHandle(ReadPipe);
    end;
  end;
end;

转载:https://blog.csdn.net/qq_45083002/article/details/131138572