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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2016, 15:07   #1
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию Работа с командной строкой

Код:
void ExecuteCommand(const AnsiString ACommand, TStrings* AOutput = NULL)
{
  TSecurityAttributes sa;
  HANDLE hReadPipe, hWritePipe;

  sa.nLength = sizeof(TSecurityAttributes);
  sa.bInheritHandle = true;
  sa.lpSecurityDescriptor = NULL;

  if(CreatePipe(&hReadPipe, &hWritePipe, &sa, 0))
  {
    TProcessInformation pi;
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb          = sizeof(si);
    si.hStdOutput  = hWritePipe;
    si.hStdInput   = hReadPipe;
    si.dwFlags     = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    try
    {
      if(CreateProcess(NULL,
                      ACommand.c_str(),
                      &sa,
                      &sa,
                      true,
                      NORMAL_PRIORITY_CLASS,
                      NULL,
                      NULL,
                      &si,
                      &pi))
      {
        try
        {
          while (WaitForSingleObject(pi.hProcess, 10) == WAIT_TIMEOUT)
          {
            Application->ProcessMessages();
          }

          if(AOutput)
          {
            const BufferSize = 2000;
            char* Buffer = (char*)malloc(BufferSize + 1);
            DWORD BytesRead;
            do
            {
              BytesRead = 0;
              ReadFile(hReadPipe, Buffer, BufferSize, &BytesRead, NULL);
              Buffer[BytesRead]= 0;
              OemToAnsi(Buffer,Buffer);
              AOutput->Text = AOutput->Text + StringReplace(Buffer,"\r\r\n","\r\n",TReplaceFlags()<<rfReplaceAll);
            }
            while(BytesRead > BufferSize);
            if (Buffer)	delete [] Buffer;
          }
        }
        __finally
        {
          CloseHandle(pi.hProcess);
          CloseHandle(pi.hThread);
        }
      }
    }
    __finally
    {
      CloseHandle(hReadPipe);
      CloseHandle(hWritePipe);
    }
  }
}
//-------------------------------------------------------------------------
Добрый день. Знающие люди-добрые) помогите довести до ума процедуру.
Данная процедура выводит в memo результат выполнения команды командной строки.
Команда ipconfig Выполняется нормально и все выводится в memo, но другие команды , например md c:\test не выполняется, ввожу команду help , в диспетчере задач процесс help.exe появляется и висит в memo ничего не выводится , завершаю процесс help.exe и в memo сразу выводится справка.Помогите сделать так чтобы все работало корректно
UbeiBobra вне форума Ответить с цитированием
Старый 05.04.2016, 15:41   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вы нигде не читаете из трубы.
Вернее читаете только после заверешения процесса а процесс может не завершится, если никто не читает его вывод.

Самое простое решение - поток, который будет читать все время из hReadPipe.

Далее, цикл чтения отработает всего один раз - BytesRead не может быть больше чем BufferSize.
waleri вне форума Ответить с цитированием
Старый 05.04.2016, 15:59   #3
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию

А можете подправить мой код пожалуйста что бы читало из "трубы" и.т.д, просто я ни слова не понял в том что вы написали и вообще я не силен в потоках , пайпах и.д
UbeiBobra вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
unix. работа с командной строкой. alexandrkamarov Помощь студентам 0 07.10.2014 19:54
Работа с командной строкой. Fortran c0ach Помощь студентам 0 04.12.2013 00:37
Работа с командной строкой YukkA Помощь студентам 0 01.06.2012 12:45
Творческая работа с командной строкой -Jack- Общие вопросы Delphi 9 30.04.2012 04:10
Работа с командной строкой lyryks Помощь студентам 2 16.11.2007 13:06