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

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

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

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

Сообщение UncleAndy » 23.08.2011 23:25:50

Делаю не особо сложный переносимый проект. Создаю в 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?
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение Brainenjii » 24.08.2011 14:24:18

poUsePipes?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение UncleAndy » 24.08.2011 14:37:28

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

А что с ним не так? Если его убираю, то просто исключение выдается при попытке записать в Input или считать из Output.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение alexs » 24.08.2011 20:16:36

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

Я в своё время столкнулся с ограничением на размер буфера для потока Input
если запускаемое мною приложение в свой Output писало более 4-х кил то всё висло.
используй асинхронный процес - он это позволяет обойти.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение UncleAndy » 24.08.2011 23:36:37

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

alexs, можно подробнее на счет асинхронного процесса? Кстати, в input пишу очень мало данных - явно меньше 4к. Но проблема именно в input, т.к. использование временных файлов решило проблему.
UncleAndy
новенький
 
Сообщения: 14
Зарегистрирован: 12.07.2011 19:00:24

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

Сообщение minoshi » 25.08.2011 08:43:45

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


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

Или можно списаться с Мартином.
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], MailRu[bot] и гости: 20

Рейтинг@Mail.ru
cron