Несколько вопросов по TProcess

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Несколько вопросов по TProcess

Сообщение VirtUX »

Имеется код:

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

//Форма прячется, но может быть показана по щелчку в трее
FormMain.Hide;
FProcess = TProcess.Create(nil);
FProcess.CommandLine := ProcessPath + ' ' + DBPath;
FProcess.Execute;
while FProcess.Running do begin
      //Отслеживаем выход из приложения
      if Application.Terminated then begin
        FreeAndNil(FProcess);
        exit;
      end;
      //Разрешим работу, пока внешнее приложение в процессе
      Application.ProcessMessages;
      sleep(10);
  end;
  FreeAndNil(FProcess);
  //Если форма еще скрыта, то покажем
  if not FormMain.Visible then FormMain.Show;

1. блок while не выполняется ни разу. Почему?
2. как закрыть внешнее приложение с помощью TProcess?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Делаю так, у меня все ок, может вообще приложение не стартует? я запускаю блокнот, и пока его не закрою идет инкрементация переменной если вообще окно не прятать(сворачивать), можно видеть число выполнения цикла

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


procedure TForm1.Button1Click(Sender: TObject);
var FProcess : TProcess;
    I:Integer;
begin
 Application.Minimize;
  I:=0;
FProcess := TProcess.Create(nil);
FProcess.CommandLine := 'C:\Windows\System32\notepad.exe';
FProcess.Execute;
while FProcess.Running do begin
      //Отслеживаем выход из приложения
      if Application.Terminated then begin
        FreeAndNil(FProcess);
        exit;
      end;
      //Разрешим работу, пока внешнее приложение в процессе
      Application.ProcessMessages;
      sleep(10);
      inc(I);
      Caption:=IntToStr(I);
      Application.Restore;
  end;
  FreeAndNil(FProcess);

  //Если форма еще скрыта, то покажем
  //if not FormMain.Visible then FormMain.Show;
end;


Второй вопрос, ну про процесс не знаю, когда нужно что то подобное, для винды нужно найти Хэндл окна(приложения) при помощи FindWindow вроде, если нашли через сообщение можно послать мол закройся.... Если именно через Процесс... я не знаю :oops:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Maxizar писал(а):может вообще приложение не стартует?

Приложение стартует. Мне кажется проблема в следующем: Приложение 16-ти битное. Windows XP запускает его через wowexec.exe.
Может есть какой-то параметр у TProcess касательно 16-ти биток?
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

1. блок while не выполняется ни разу. Почему?

Может TProcess лучше поместить в отдельный поток :?:
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Блок while не выполняется потому, что после команды FProcess.Execute параметр FProcess.Running равен false! Мне кажется - это связано с 16-ти битностью запускаемого внешнего приложения.
Ответить