Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Как отследить результат выполнения "cmd dir"? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ ::GetDlgItem : разные значения в замисимости от ОС http://www.cyberforum.ru/cpp-beginners/thread493382.html
::GetDlgItem : разные значения в замисимости от ОС Как известно, IDC_STATIC = (-1), так вот, вызывая ф-ю ::GetDlgItem(... , IDC_STATIC), где IDC_STATIC переменная, от которой надо взять HWND, ХР...
C++ Внимание! Интересная высокооплачиваемая работа для программиста. Компании занимающейся выпуском высокотехнологичной продукции требуется программист для выполнения следующей работы: 1. Необходимо разработать метод сравнения двух произвольных изображений... http://www.cyberforum.ru/cpp-beginners/thread493290.html
Ошибка: IdSMTP1->QuickSend(Host, Subj, To, From, TextMess); IdSMTP1->Disconnect(); C++
AnsiString Host = '10.10.102.160'; AnsiString To = 'gg@tel.net'; AnsiString From = 'pp@tel.net'; AnsiString Subj = 'Hello!'; AnsiString TextMess = 'Test'; IdSMTP1->Connect(); IdSMTP1->Host =...
МедиаПлейр в Windows Embeded Сannot detemine the device type C++
Здравствйте алл. Столкнулся с проблемкой. System--MediaPlayer В стандартной ВиндовсХП все работает. А в Embeded не работает При запуске Windows--system32--mplay32.exe и выборе файла пишет...
C++ FTP через proxy. Подскажите пожалуйста http://www.cyberforum.ru/cpp-beginners/thread493261.html
Неделю бьюсь, не могу получить файлы.. Сетка подключена к интернету через proxy (192.168.0.1:80) Необходимо взять/передать по ftp (вход-логин/пароль) файлы hInternetSession =...
C++ Программирование на С/C++ для ST20 микроконтроллера Добрый день, Приглашаю пообщаться тех , кому по долгу службы или по велению сердца приходится программировать на С/С++ для микроконтроллерный систем, в частности основанных на микроконтроллере... подробнее

Показать сообщение отдельно
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:02
Как захватить весь вывод в консоли.

Компилятор: Delphi



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
unit consoleoutput; 
 
interface
 
uses
  Controls, Windows, SysUtils, Forms;
 
function GetDosOutput(const CommandLine:string): string;
 
implementation
 
function GetDosOutput(const CommandLine:string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, 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('Could not execute command line!')
    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;
        until not WasOK or (BytesRead = 0);
        // ждём, пока завершится консольное приложение
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
      result:=Line;
      CloseHandle(StdOutPipeRead);
  end;
end;
 
end.
Запуск программ с передачей консольного ввода и чтением вывода.

Компилятор: Delphi

Автор: Алексей Бойко

Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.

Delphi
1
2
3
4
5
function ExecuteFile(FileName,StdInput: string;
                     TimeOut: integer;
                     var StdOutput:string) : boolean;
 
label Error;
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru