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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 5.00
MaD1
#1

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

06.03.2011, 21:15. Просмотров 2598. Ответов 16
Метки нет (Все метки)

Здорово, народ!

У меня такая проблема:
например я функцией WinExec() или ShellExecute()
запускаю допустим команду 'dir' - так вот как мне результат выполнения данной команды (т.е. полившийся список файлов) направить допустим в переменную?

Надеюсь, доходчиво объяснил
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как отследить результат выполнения "cmd dir"? (C++):

Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" - C++
#include <windows.h> #include <d3d9.h> LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); struct...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Как отследить ошибку "Stack around the variable was corrupted."? - C++
Вообщем код большой. Несколько классов, десяток функций. Ошибка всплывает только после завершения функции main(). Вот как бы научить...

Как правильно задать параметр "время выполнения алгоритма"? - C++
как правильно задать параметр "время выполнения алгоритма"? #include <iostream> #include <math.h> #include <time.h> #include...

В чем разница между "Порядок выполнения программ на языке C" и "Структура программы на языке C" - C++
в конспектах у себя не нашел, хоть и записывал все, что объяснял преподаватель. вот, собственно, сам вопрос: Структура программы на...

Как "подкрасить" некоторые элементы массива на выводе во время выполнения программы - C++
как "подкрасить" некоторые элементы массива на выводе во время выполнения программы в общем, необходимо, если такое возможно, чтобы,...

16
Silver
07.03.2011, 10:54 #2
Дико извиняюсь, но это азы работы с командной строкой
---
dir > file.txt
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 13:55 #3
Стандартными средствами pipe!!
Можно перенаправить i/o поток в файл, буфер, парсер, другое приложение. Все это можно выдрать из инета...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SECURITY_ATTRIBUTES sa;
....
HANDLE hStdOutReadTmp;
CreatePipe(&hStdOutReadTmp, &m_stdOut.....
 
STARTUPINFO si;
::ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
-------------------------------
si.hStdOutput = hStdOut;
-------------------------------
 
CreateProcess('dir'....... &si, &pi);
0
MaD1
07.03.2011, 17:06 #4
Я знаю как работать с коммандной строкой! Блин, попробую с пипе - этот чувак мнея понял
MaD1
07.03.2011, 17:13 #5
Я конечно извиняюсь, но не могли бы ли вы подкинуть мне ссылку? Сам что-то не могу найти, находится только про PIPE+сеть - а это по-моему не то.
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 17:25 #6
Исходники этого(см.выше) кода выслал по почте.
0
Silver
07.03.2011, 17:48 #7
Не обижайся! Мне кажется проще сбросить все в файл
и потом его обработать, чем связываться с пайпами.
Достоинство программы в её работоспособности,
а не красоте исходного кода.
Silver
07.03.2011, 17:50 #8
Если уж на то пошло, то почему не использовать
FindFirst + FindNext ?
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 18:02 #9
Эти функции для работы с базами данных?
На придыдущие : -'амбиции и желание совершенства съедают'.

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

Компилятор: 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
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:26 #11
Как использовать консоль в не-консольном приложении.

Компилятор: Delphi 3.x (или выше)

Для того, чтобы добавить в не-консольное приложение ввод/вывод из консоли, необходимо воспользоваться функциями AllocConsole и FreeConsole.

Пример:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject); 
var 
   s: string; 
begin 
  AllocConsole; 
  try 
    Write('Type here your words and press ENTER: '); 
    Readln(s); 
    ShowMessage(Format('You typed: '%s'', [s])); 
  finally 
    FreeConsole; 
  end; 
end;
0
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:31 #12
никто не застваляет делать это на дельфи )
ну раз эти водоплавающие делают...
Сионистам это сам бог велел !!!
С++ и винда разговаривают на языке: ты и я одной крови ))
0
MaD1
08.03.2011, 16:45 #13
Люди! Я не очень представляю себе что такое пайпы, но думаю что это хорошо По-моему проще WinExec'ом запутсить батник в котором 'dir > file.txt' а потом прочиттать этот файл. Так легче, но быстрее ли? хмм наверное нет. А с пайпами я никак не разберусь....
Silver
09.03.2011, 14:51 #14
Я именно это и предлагал с самого начала.
Ребята, давайте писать (программы) просто!
Простота как известно синоним гениальности.
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
09.03.2011, 14:58 #15
Не все простое гениальное: Не синоним)

За сложным решением всегда следует простое обьяснение не попробуешь не узнаешь.
0
09.03.2011, 14:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 14:58
Привет! Вот еще темы с ответами:

Как убрать "*" после выполнения программы - C++
Программа поиска простых множителей.Вывод на экран должен выглядеть так:для n=3960 Ваша программа должна выдать 11 * 5 * 3 * 3 * 2 * 2 * 2...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода? - C++
Здраствуйте! Подскажите как это делается? (вопрос в названии темы) среда : VS2013 проект компилируется в dll файл в начале...

Подскажите как сделать, например "для продолжения нажмите клавишу х" и дальше выводится результат с шагом заданым пользователем - C++
Подскажите как сделать, например "для продолжения нажмите клавишу х" и дальше выводится результат с шагом заданым пользователем


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru