Ana içeriğe atla

PeekNamedPipe

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

Bu blogdaki popüler yayınlar

BMO'yu Bekliyorumdur

Bilgisayar Mühendisleri Odası Yönetmeliğinin 91. maddesine göre bir iş yerinde en az üç oda üyesi varsa ilgili işyerine işyeri temsilcisi atanabilir. TÜRK MÜHENDİS VE MİMAR ODALARI BİRLİĞİ BİLGİSAYAR MÜHENDİSLERİ ODASI ANA YÖNETMELİĞİ İşyeri ve iş bölgesi temsilcilikleri MADDE 91 – (Başlığı ile birlikte değişik:RG-2/10/2014-29137) (1) En az üç üyenin bulunduğu işyerlerinde veya iş bölgelerinde oda-üye ilişkilerini geliştirmek amacı ile oda yönetim kurulu kararı ile işyeri ve iş bölgesi temsilcilikleri kurulabilir. İşyeri ve iş bölgesi temsilcisi ve yardımcıları şube yönetim kurulu ya da şube yok ise oda yönetim kurulu kararı ile atanır ve görevden alınır. İşyeri ve iş bölgesi temsilcilerinin görevleri oda yönetim kurulu tarafından belirlenir. İşyerinde oda - üye ilişkilerini daha etkili hale getirebilmek için odaya başvurdum ve çalıştığım işyerine beni ya da yönetim kurulunun uygun göreceği başka bir üye arkadaşın işyeri temsilcisi olarak belirlenmesini talep ettim. (Bu ta...