Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 24.01.2011
Сообщений: 82
1

перехват вывода в консоль

25.03.2011, 11:01. Показов 3227. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. Нужно написать программу которая бы запускала дочернее консольное приложение (разработанное не мной) и перехватывала вывод в консоль к себе в компонент Memoю вот написал такуой кусок программы, прога запускает дочерний процесс но не ловит вывод в консоль...

C++
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
    char buf[1024];           //буфер ввода/вывода
 
    PROCESS_INFORMATION piProcInfo;
    STARTUPINFO siStartInfo;
    SECURITY_ATTRIBUTES sa;
    SECURITY_DESCRIPTOR sd;        //структура security для пайпов
    HANDLE newstdin,newstdout,read_stdout,write_stdin;  //дескрипторы
                                                      // пайпов
 
 
    if (IsWinNT())        //инициализация security для Windows NT
  {
    InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, true, NULL, false);
    sa.lpSecurityDescriptor = &sd;
  }
 
  else sa.lpSecurityDescriptor = NULL;
 
  sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle = true;       //разрешаем наследование дескрипторов
 
  if (!CreatePipe(&newstdin,&write_stdin,&sa,0))   //создаем пайп
  {
    ErrorMessage("Ошибка создания входного канала для модуля прошивки");
    return;
  }
 
  if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп
                                                  // для stdout
  {
    ErrorMessage("Ошибка создания выходного канала для модуля прошивки");
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
    return;
  }
  ZeroMemory(&siStartInfo, sizeof(siStartInfo));
  ZeroMemory(&piProcInfo, sizeof(piProcInfo));
    GetStartupInfo(&siStartInfo);      //создаем startupinfo для
                                    // дочернего процесса
    siStartInfo.cb          = sizeof(STARTUPINFO);
    siStartInfo.wShowWindow= SW_HIDE;     //прячем окно
    siStartInfo.dwFlags =STARTF_USESTDHANDLES| STARTF_USESHOWWINDOW;
   //   siStartInfo.lpDesktop   = NULL;
    siStartInfo.hStdOutput = newstdout;
    siStartInfo.hStdError = newstdout;   //подменяем дескрипторы для
    siStartInfo.hStdInput = newstdin;    // дочернего процесса
    char app_spawn[] ="\"D:\\syrax\\7188dos\\7188w \"";
    int result= CreateProcess(NULL,app_spawn,&sa,&sa,TRUE,CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
                     NULL,NULL,&siStartInfo,&piProcInfo);
     if(!result)
     {
         Memo1->Lines->Add("Не удается открыть модуль прошивки. Повторите..");
         CloseHandle(newstdin);
        CloseHandle(newstdout);
        CloseHandle(read_stdout);
        CloseHandle(write_stdin);
        return;
     }
    unsigned long exit=0;  //код завершения процесса
    unsigned long bread;   //кол-во прочитанных байт
    unsigned long avail;   //кол-во доступных байт
     Memo1->Lines->Add("Модуль прошивки успешно запущен...");
     bzero(buf);
 
 
 for(;;)      //основной цикл программы
  {
    GetExitCodeProcess(piProcInfo.hProcess,&exit); //пока дочерний процесс
                                           // не закрыт
    if (exit != STILL_ACTIVE)
      break;
 
    PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
 
    //Проверяем, есть ли данные для чтения в stdout
 
    if (bread != 0)
    {
      bzero(buf);
      if (avail > 1023)
      {
        Memo1->Lines->Add("Est data");
        while (bread >= 1023)
        {
          ReadFile(read_stdout,buf,1023,&bread,NULL);  //читаем из
                                                       // пайпа stdout
          Memo1->Lines->Add(buf);
          bzero(buf); // функия очистки буфера
        }
      }
 
      else {
        ReadFile(read_stdout,buf,1023,&bread,NULL);
        Memo1->Lines->Add(buf);
      }
    }
} 
    KillProcByPid(piProcInfo.dwProcessId);
 
    CloseHandle(piProcInfo.hThread);
    CloseHandle(piProcInfo.hProcess);                                           // в stdin
    CloseHandle(newstdin);
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);
 
  }
нужно еще реализовать ввод в эту консоль определенную комбинацию клавиш, но это уже следующий этап.. помогите разобраться с этим..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2011, 11:01
Ответы с готовыми решениями:

Перехват ввода-вывода другой программы
Имеется игровой сервер, запускается ввиде консоли. В частности, сервер игры CS Source. Нужно...

Преобразование массива Unicode для вывода в консоль
...Доброго времени суток, уважаемые форумчане! Возник, наверное, банальный вопрос: как...

Код для просмотра сайта с расписанием и вывода его в консоль
Здравствуйте, подскажите пожалуйста, как можно сделать программку, что бы она просматривала...

Подготовить числа для вывода на консоль через ASCII и вывести на консоль
В регистре eax находится число, которое нужно превратить в ASCII-код и вывести на консоль символы,...

3
LK
Заблокирован
25.03.2011, 14:45 2
Запускаете с ShellExecute, находите окно
C++
1
HWND hWnd = FindWindow(L"ConsoleWindowClass", NULL);
0
2 / 2 / 1
Регистрация: 24.01.2011
Сообщений: 82
25.03.2011, 15:57  [ТС] 3
это не решение моей проблемы
0
LK
Заблокирован
25.03.2011, 16:09 4
я и не пытался решать вашу проблему...
0
25.03.2011, 16:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2011, 16:09
Помогаю со студенческими работами здесь

Буферизация вывода в консоль, и цветной вывод в консоль
Потребовалось реализовать цветной вывод массивов в консоль(некоторые значения выделить зеленым)....

перехват нажатия Ctrl+Z (консоль)
Доброго времени суток! У меня есть такая задача: из консоли надо построчно записывать строки в...

Перехват вывода
Всем привет! Есть библиотека dll(написана на с++), которая внедрена в таблицу импорта программы...

Перехват вывода консоли
Подскажите, как можно реализовать следующую задачу? По ShellExecute запускается консольная...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru