Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Получение результатов выполнения командной строки   Найти похожие ветки 

 
Jetus ©   (2005-01-28 10:47) [0]

Уважаемые мастера! Есть такая беда: я выполняю функцией WinExec() некоторые команды командной строки Windows XP, например:
WinExec("cmd /c SystemInfo", 1);
В результате данная командная строка выводит кучу полезных даных о компе.

Как получить эти данные в своей программе и поместить их, например, в Мемо?


 
Kerk ©   (2005-01-28 10:51) [1]

WinExec("cmd /c SystemInfo >blabla.txt", 1);

или stdout перенаправь


 
xShadow ©   (2005-01-28 10:56) [2]

речь идёт о перенаправлении вывода

Function GetDosOutput( const CommandLine, WorkDir: String; var
ResultCode: Cardinal ): String;
var StdOutPipeRead, StdOutPipeWrite: THandle;
   SA                             : TSecurityAttributes;
   SI                             : TStartupInfo;
   PI                             : TProcessInformation;
   WasOK                          : Boolean;
   Buffer                         : array[0..255] of Char;
   BytesRead                      : Cardinal;
   Line                           : String;
Begin
   //Application.ProcessMessages;
   With SA do
   Begin
      nLength := SizeOf( SA );
      bInheritHandle := True;
      lpSecurityDescriptor := nil;
   end;
   // создаём пайп для перенаправления стандартного вывода
   CreatePipe( StdOutPipeRead,  // дескриптор чтения
               StdOutPipeWrite, // дескриптор записи
               @SA,              // аттрибуты безопасности
               0                // количество байт принятых для пайпа - 0 по умолчанию
              );
   try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    with SI do
    Begin
       FillChar( SI, SizeOf( SI ), 0 );
       cb := SizeOf( SI );
       dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
       wShowWindow := SW_HIDE;
       hStdInput := GetStdHandle( STD_INPUT_HANDLE ); // стандартный ввод не перенаправляем
       hStdOutput := StdOutPipeWrite;
       hStdError := StdOutPipeWrite;
    end;

    //Запускаем компилятор из командной строки
    //WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess( nil,
                            PChar( CommandLine ),
                            nil,
                            nil,
                            True,
                            0,
                            nil,
                            PChar( WorkDir ),
                            SI,
                            PI );
    // Теперь, когда дескриптор получен, для безопасности закрываем запись.
    // Нам не нужно, чтобы произошло случайное чтение или запись.
    CloseHandle( StdOutPipeWrite );
    // если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then
     raise Exception.Create( "Ошибка выполнения или компиляции: " +
            Chr( 10 ) + Chr( 13 ) + CommandLine )
    else
      try
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
        Line := "";
        Repeat
           // читаем блок символов (могут содержать возвраты каретки и переводы строки)
           WasOK := ReadFile( StdOutPipeRead, Buffer, 255, BytesRead, nil );
           // есть ли что-нибудь ещё для чтения?
           if BytesRead > 0 then
           Begin
              // завершаем буфер PChar-ом
              Buffer[BytesRead] := #0;
              // добавляем буфер в общий вывод
              Line := Line + Buffer;
           end;
           //Application.ProcessMessages;
        Until not WasOK or ( BytesRead = 0 );
        // ждём, пока завершится консольное приложение
        WaitForSingleObject( PI.hProcess, INFINITE );
        ResultCode := 0;
        GetExitCodeProcess( PI.hProcess, ResultCode );
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle( PI.hThread );
        CloseHandle( PI.hProcess );
      end;
   finally
     Result := Line;
     CloseHandle( StdOutPipeRead );
 end;
end;

Использовать так:
Memo1.Lines.Text := GetDosOutput( "del c:\*.*", "c:\", Rc );


 
Jetus ©   (2005-01-29 21:53) [3]

Огромное спасибо, xShadow!
Обязательно попробую, когда новую Дельфу поставлю ;)


 
Jetus ©   (2005-02-01 18:07) [4]

К сожалению, xShadow, твой код не работает - выдает ошибку в строке

if not WasOK then
 raise Exception.Create( "Ошибка выполнения или компиляции: " +
 Chr( 10 ) + Chr( 13 ) + CommandLine )

Почему то не WasOK := CreateProcess() не запускает процесс и соответственно выкидываен ошибку. В чем причина?



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-1109237475
Zilog
2005-02-24 12:31
2005.03.13
Обьясните, пж, почему поток без sleep(1) тормозит?


4-1107244363
VsInLg
2005-02-01 10:52
2005.03.13
CreateThread и BeginThread


3-1108461764
Oleg_
2005-02-15 13:02
2005.03.13
русские буквы в paradox через BDE


1-1109333721
markers
2005-02-25 15:15
2005.03.13
Два вопроса по сети.


9-1103336112
Книг
2004-12-18 05:15
2005.03.13
Что такое нормаль к точке и как её правильно задавать ?