TProcess под Windows и появление консоли

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

TProcess под Windows и появление консоли

Сообщение UncleAndy »

Делаю не особо сложный переносимый проект. Создаю в Lazarus под Linux. В проекте есть вот такой код работы с gpg:

Код: Выделить всё

   proc := TProcess.Create(Self);
   if inputText = '' then
      proc.Options := proc.Options + [poWaitOnExit, poUsePipes]
   else
      proc.Options := proc.Options + [poUsePipes];
   proc.CommandLine := cmd;
   try
      proc.Execute;
      if inputText <> '' then
      begin
         strl.Clear;
         strl.Add(inputText);
         strl.SaveToStream(proc.Input);
         strl.Clear;
         proc.CloseInput;
         while proc.Running do
         begin
            if resFromStderr then
               strl.LoadFromStream(proc.Stderr)
            else
               strl.LoadFromStream(proc.Output);
                  buf := buf + strl.Text;
                  strl.Clear;
               end;
      end
      else
      begin
         if resFromStderr then
            strl.LoadFromStream(proc.Stderr)
         else
            strl.LoadFromStream(proc.Output);
               buf := buf + strl.Text;
      end;
   finally
           proc.Free;
   end;


Под Linux все работает отлично.

Под Windows (семерка) при вызове Execute появляется посторонняя консоль и выполнение программы блокируется пока ее вручную не закроешь. Пробовал использовать poNoConsole в опциях, но тогда почему-то не появляется даже главное окно приложения. Хотя видно что само приложение запускается (по иконке в трэе и в диспетчере задач).

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

Добавлено спустя 14 часов 54 минуты 5 секунд:
Когда поставил poNoConsole и убрал poWaitOnExit оно, вроде, заработало. Но не полностью.

Теперь программа один раз отрабатывает на --list-keys нормально, а вот при необходимости передать на вход данные и получить ответ возникает проблема. Возможно у TProcess есть какие-то особенности в этом случае при использовании в Windows?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

poUsePipes?
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Brainenjii писал(а):poUsePipes?

А что с ним не так? Если его убираю, то просто исключение выдается при попытке записать в Input или считать из Output.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

UncleAndy писал(а):Возможно у TProcess есть какие-то особенности в этом случае при использовании в Windows?

Я в своё время столкнулся с ограничением на размер буфера для потока Input
если запускаемое мною приложение в свой Output писало более 4-х кил то всё висло.
используй асинхронный процес - он это позволяет обойти.
UncleAndy
новенький
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

Сообщение UncleAndy »

Пока как затычку использую скидывание во временный файл и указание его в параметрах. Коряво, но работает.

alexs, можно подробнее на счет асинхронного процесса? Кстати, в input пишу очень мало данных - явно меньше 4к. Но проблема именно в input, т.к. использование временных файлов решило проблему.
Аватара пользователя
minoshi
постоялец
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Сообщение minoshi »

UncleAndy писал(а):
Под Windows (семерка) при вызове Execute появляется посторонняя консоль и выполнение программы блокируется пока ее вручную не закроешь. Пробовал использовать poNoConsole в опциях, но тогда почему-то не появляется даже главное окно приложения. Хотя видно что само приложение запускается (по иконке в трэе и в диспетчере задач).


можно глянуть на компоненты tterminal и tmseprocess в MSEide+MSEGUI. Там реализовано предотвращение появления консоли в виндовс при запуске какого-то процесса из программы. Включается опцией pro_inactivate. Честно, пытался сам разобраться как это прикрутить к tprocess, но видимо логика Мартина мне не доступна. :)

Или можно списаться с Мартином.
Ответить