Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 02:17   #1
Slonnn
Пользователь
 
Регистрация: 13.02.2009
Сообщений: 14
По умолчанию Перехват строк из консольного приложения

Здравствуйте, пишу программу на C++ Builder, которая будет перехватывать и обрабатывать строки появляющиеся в консольном приложении. Консольное приложение стороннее, хоть как-то изменить его не удасться. exe-шник этого консольного приложения запускается через мою программу. Далее в консольном приложении появляются строки, которые мне нужно перехватить для обработки в моей программе.
Например: в консольном приложении появилась строка "Hello", её нужно считать с консоли и вывести в Edit.

Кто что посоветует?
Slonnn вне форума Ответить с цитированием
Старый 05.04.2010, 02:34   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я вам посоветую сходить в поиск.
эта тема здесь есть.
может там и на Делфи в основном примеры, но АПИ и там и там одно.

ЗЫ: и внизу еще подобные темы есть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 18:00   #3
Slonnn
Пользователь
 
Регистрация: 13.02.2009
Сообщений: 14
По умолчанию

Это всё работает для текущего консольного приложения, а у меня оно стороннее.

Найти само окно консоли могу, могу его закрыть, а считать что-либо не получается.

+ консольное приложение сворачивается при запуске.

Последний раз редактировалось Stilet; 06.04.2010 в 14:56.
Slonnn вне форума Ответить с цитированием
Старый 06.04.2010, 14:40   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще то там запускается консольное приложение.
Код:
exe-шник этого консольного приложения запускается через мою программу
что вполне удовлетворяет условию.
http://programmersforum.ru/showpost....32&postcount=2
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.04.2010, 14:57   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а у меня оно стороннее.
Обсуждалось и для стороннего.
Ищи по слову ExecConsoleApp
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2010, 23:49   #6
Slonnn
Пользователь
 
Регистрация: 13.02.2009
Сообщений: 14
По умолчанию

Попытался перевести код на C++ Builder. В итоге получилось что консольное приложение запускается, но ничего на него не выводится. В том приложении консольном идёт запись с в .txt файл - это работает, но почему на экране не отображается её вывод?

Вот посмотрите мой перевод кода, может что намудрил (первый раз переводил из Delphi в С++ Builder)

Код:
void __fastcall TForm1::ExecConsoleApp(AnsiString CommandLine, TStringList *Output, TStringList *Errors)
{
  SECURITY_ATTRIBUTES sa;
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  HANDLE hPipeOutputRead;
  HANDLE hPipeOutputWrite;
  HANDLE hPipeErrorsRead;
  HANDLE hPipeErrorsWrite;
  int Res, bTest;          
  char env[100];
  char szBuffer[256];
  DWORD dwNumberOfBytesRead;
  TMemoryStream *Stream;  

  sa.nLength = sizeof(sa);
  sa.bInheritHandle = true;
  sa.lpSecurityDescriptor = NULL;
  CreatePipe(&hPipeOutputRead, &hPipeOutputWrite, &sa, 0);
  CreatePipe(&hPipeErrorsRead, &hPipeErrorsWrite, &sa, 0);
  ZeroMemory(&env, sizeof(env));
  ZeroMemory(&si, sizeof(si));
  ZeroMemory(&pi, sizeof(pi));
  si.cb = sizeof(si);
  si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  si.wShowWindow = SW_MINIMIZE;   //SW_HIDE
  si.hStdInput = 0;
  si.hStdOutput = hPipeOutputWrite;
  si.hStdError = hPipeErrorsWrite;

  Res = CreateProcess(NULL, CommandLine.c_str(), NULL, NULL, true,
    CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, &env, NULL, &si, &pi);

  if (!Res)
  {
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    return;
  }
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

  Stream = new TMemoryStream;

  try
  {
    while (true)
    {
      bTest = ReadFile(hPipeOutputRead, szBuffer, 256, &dwNumberOfBytesRead, NULL);
      if  (!bTest) break;
      Stream->Write(szBuffer, dwNumberOfBytesRead);
    }
    Stream->Position = 0;
    Output->LoadFromStream(Stream);
  }
 __finally
        {
        delete Stream;
        }

    Stream = new TMemoryStream;
  
  try
  {
    while (true)
    {
      bTest = ReadFile(hPipeErrorsRead, szBuffer, 256, &dwNumberOfBytesRead, NULL);
      if  (!bTest) break;
      Stream->Write(szBuffer, dwNumberOfBytesRead);
    }
    Stream->Position = 0;
    Errors->LoadFromStream(Stream);
    Output->LoadFromStream(Stream);
  }
 __finally
        {
        delete Stream;
        }

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
}

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  TStringList *OutP;
  TStringList *ErrorP;

  OutP = new TStringList;
  ErrorP = new TStringList;

  ExecConsoleApp(Edit1->Text, OutP, ErrorP);
  Memo1->Lines->Assign(OutP);

  delete Output;
  delete ErrorP;
}
Upd. С тем что не выводит строки консоль разобрался заменив
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
на
si.dwFlags = STARTF_USESHOWWINDOW;

Теперь следующие проблемы:
1) Консоль становится поверх главного окна и не даёт возможности к нему обратится пока консоль не закрыть. Мне нужно чтобы была возможность свернуть развернуть консоль и в тоже время делать какие-либо действия с главным окном в процессе выполнения консоли.
2) Не записывается в Memo1->Lines->Assign(OutP) текст, окно остаётся пустым.

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

Последний раз редактировалось Slonnn; 07.04.2010 в 01:04.
Slonnn вне форума Ответить с цитированием
Старый 08.04.2010, 14:28   #7
Slonnn
Пользователь
 
Регистрация: 13.02.2009
Сообщений: 14
По умолчанию

я всё ещё жду ответа
Slonnn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод консольного приложения в оконное varvara16 Общие вопросы C/C++ 17 10.09.2009 13:20
создание оболочки для консольного приложения Consol Работа с сетью в Delphi 2 19.08.2009 08:38
Закрытие консольного приложения по ENTER в C++ Сергей089 Помощь студентам 4 02.03.2009 21:17
перехват консольного ввода\вывода Артем5555555 Win Api 14 28.10.2008 23:20
Перехват вывода консольного приложения Роман Радер Общие вопросы Delphi 0 12.02.2007 18:40