Обмен строками с дочерним процессом
От: franzy  
Дата: 10.12.08 15:53
Оценка:
Написал вот такое приложение (Delphi):
На форме лежат четыре компонента:
Edit1 — строка для ввода команд
Button1('Запустить процесс') — кнопка, при нажатии на которую запускается дочерний процесс
Button2('Послать строку') — кнопка, при нажатии на которуюю в стандартный ввод дочернего процесса посылается строка из Edit1
Memo1 — текстовое поле, в которое выводится вывод дочернего процесса

Для передачи и приема информации из дочернего процесса я создал неименованые каналы и при создании дочернего процесса прикручиваю их к нему. Обработку чтения из стандартного вывода я запускаю в отдельном потоке, который после прочтения чего-либо из канала вызывает функцию для обработки данных, токорая, в свою очередь, всё что получит просто добавляет в Memo1.
Вот вопросы начинаются при выводе дочернего процесса:
Вопервых, когда я запущу допустим такое приложение как ipconfig, я на выводе получу нормальный четабельный текст, а когда допустим запушу help, то на выводе получаю кракозябры. Впринципе ясно, что дело в том, что они выводят в разных кодировках. Вот вопрос как раз в том, каким образом программно распознать кодировку в которой выводит процесс?
Вовторых, когда я допустим запущу такое приложение как cmd.exe, то после того как я нажму кнопу Button2(Послать строку), то поток чтения зависает на функции ReadFile. Возможно здесь опятьже проблема кодировок, так кая просто беру строку из Edit1 и посылаю процессу


  ....
  var
   chBuff:array [0..255] of char;
   i:Integer;
  begin
   ...
   //копирую строку в буфер для вывода
   ZeroMemory(chBuff,SizeOf(chBuff));
   for i:=1 to length(Edit1.Text) do
   begin
    chBuff[i-1]:=Edit1.Text[i];
   end;
   //посылаю строку на вводд дочернего процесса
   WriteFile(hChildStdInWr,chBuff,SizeOf(chBuff),wrBytes,nil);
  end;


Если проблема в кодировках, то видимо cmd/exe получает что-то для него непонятное и незная как это обработать, просто завершает работу. Тогда ещё два вопроса:
1. Подскажите алгоритм для перекодировки строки, которую я посылаю на ввод процесса.
2. Как поймать момент, когда дочерний процесс завеошает свою работу? Допустим для того, чтобы просто остановить поток для чтения вывода, или просто просигнализировать пользователю, что программа закончила работу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.