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

 

Code:

{

This function runs a program (console or batch) and adds its output

to Memo1

}

 

{....}

private

   function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;

 

{....}

 

function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;

var

start: TStartupInfo;

procInfo: TProcessInformation;

tmpName: string;

tmp: Windows.THandle;

tmpSec: TSecurityAttributes;

res: TStringList;

return: Cardinal;

begin

Result := False;

try

   { Set a temporary file }

   tmpName := 'Test.tmp';

   FillChar(tmpSec, SizeOf(tmpSec), #0);

   tmpSec.nLength := SizeOf(tmpSec);

   tmpSec.bInheritHandle := True;

   tmp := Windows.CreateFile(PChar(tmpName),

          Generic_Write, File_Share_Write,

          @tmpSec, Create_Always, File_Attribute_Normal, 0);

   try

     FillChar(start, SizeOf(start), #0);

     start.cb          := SizeOf(start);

     start.hStdOutput  := tmp;

     start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;

     start.wShowWindow := SW_Minimize;

     { Start the program }

     if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,

                      0, nil, PChar(_dirName), start, procInfo) then

     begin

       SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);

       WaitForSingleObject(procInfo.hProcess, Infinite);

       GetExitCodeProcess(procInfo.hProcess, return);

       Result := (return = 0);

       CloseHandle(procInfo.hThread);

       CloseHandle(procInfo.hProcess);

       Windows.CloseHandle(tmp);

       { Add the output }

       res := TStringList.Create;

       try

         res.LoadFromFile(tmpName);

         Memo1.Lines.AddStrings(res);

       finally

         res.Free;

       end;

       Windows.DeleteFile(PChar(tmpName));

     end

     else

     begin

       Application.MessageBox(PChar(SysErrorMessage(GetLastError())),

         'RunCaptured Error', MB_OK);

     end;

   except

     Windows.CloseHandle(tmp);

     Windows.DeleteFile(PChar(tmpName));

     raise;

   end;

finally

end;

end;

 

 

// Example:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

RunCaptured('C:\', 'cmd.exe', '/c dir');

end;

 

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

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

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

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


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