Содержание материала

 

Code:

procedure Dos2Win(CmdLine:String; OutMemo:TMemo);

const BUFSIZE = 2000;

var SecAttr    : TSecurityAttributes;

   hReadPipe,

   hWritePipe : THandle;

   StartupInfo: TStartUpInfo;

   ProcessInfo: TProcessInformation;

   Buffer     : Pchar;

   WaitReason,

   BytesRead  : DWord;

begin

 

with SecAttr do

begin

  nlength              := SizeOf(TSecurityAttributes);

  binherithandle       := true;

  lpsecuritydescriptor := nil;

end;

// Creazione della pipe

if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then

begin

  Buffer  := AllocMem(BUFSIZE + 1);    // Allochiamo un buffer di dimensioni BUFSIZE+1

  FillChar(StartupInfo, Sizeof(StartupInfo), #0);

  StartupInfo.cb          := SizeOf(StartupInfo);

  StartupInfo.hStdOutput  := hWritePipe;

  StartupInfo.hStdInput   := hReadPipe;

  StartupInfo.dwFlags     := STARTF_USESTDHANDLES +

                             STARTF_USESHOWWINDOW;

  StartupInfo.wShowWindow := SW_HIDE;

 

  if CreateProcess(nil,

     PChar(CmdLine),

     @SecAttr,

     @SecAttr,

     true,

     NORMAL_PRIORITY_CLASS,

     nil,

     nil,

     StartupInfo,

     ProcessInfo) then

    begin

      // Attendiamo la fine dell'esecuzione del processo

      repeat

        WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);

        Application.ProcessMessages;

      until (WaitReason <> WAIT_TIMEOUT);

      // Leggiamo la pipe

      Repeat

        BytesRead := 0;

        // Leggiamo "BUFSIZE" bytes dalla pipe

        ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);

        // Convertiamo in una stringa "\0 terminated"

        Buffer[BytesRead]:= #0;

        // Convertiamo i caratteri da DOS ad ANSI

        OemToAnsi(Buffer,Buffer);

        // Scriviamo nell' "OutMemo" l'output ricevuto tramite pipe

        OutMemo.Text := OutMemo.text + String(Buffer);

      until (BytesRead < BUFSIZE);

    end;

  FreeMem(Buffer);

  CloseHandle(ProcessInfo.hProcess);

  CloseHandle(ProcessInfo.hThread);

  CloseHandle(hReadPipe);

  CloseHandle(hWritePipe);

end;

end;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить