Запуск внешнего приложения и закрытие программы

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

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

Запуск внешнего приложения и закрытие программы

Сообщение bogdan » 15.08.2016 14:08:07

Здравствуйте! Не подскажите как запустить внешнее приложение и оставить его запущенным при закрытии программы. Ubuntu-Mate 16.04 и Lazarus 1.6.
В примере идет открытие виртуальной клавиатуры, но при закрытии программы, она закрывается, нужно оставлять ее запущенной, есть ли варианты решения данной проблемы?
Код: Выделить всё
 
// Процесс запуска
ProcessRun := TProcess.Create(nil);     
ProcessRun.commandline := 'onboard';   
ProcessRun.execute();
Sleep(1000);   
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Запуск внешнего приложения и закрытие программы

Сообщение PapaNT » 15.08.2016 18:22:38

Пример готового кода:
Код: Выделить всё
Program Starter;
// Программа для запуска других приложений с возвратом номера процесса
// Номер процесса позвращается в errorlevel, выводится на консоль или записывается в файл.

uses Process,Windows, jwatlhelp32;

Var
  P     : TProcess; // Переменная управления процессом.
  PID   : Integer; // Process ID
  MyPID : DWORD; // PID текущего процесса (необходим для получения PID родительского процесса)

  h     : DWORD;
  res   : TProcessEntry32W;

  Procedure Help;
  begin
    WriteLN('Программа starter.exe предназначена для запуска программ или определения номера процееса с передачей номера запущенного процесса на консоль или в переменную ERRORLEVEL');
    WriteLN;
    WriteLN('Использование:');
    WriteLN('starter.exe e cmd.exe - Запуск cmd.exe с передачей номера процесса cmd.exe в переменную ERRORLEVEL');
    WriteLN('starter.exe w "ping 127.0.0.1" - Запуск ping с выводом номера процесса cmd.exe на консоль.');
    WriteLN('starter.exe qe - Передать в переменную ERRORLEVEL PID родительского процесса.');
  end; // Help

// Объявляем внешнюю функцию для работы со списком процессов
function GetProcessID(AHandle: HANDLE): DWORD; stdcall; external 'kernel32.dll' name 'GetProcessId';

Function GetParentPID : DWORD;
var
  h  : DWORD;
  res: TProcessEntry32W;
  ws : WideString;
  pid : DWORD;

begin
//  GetParentPID := 0;
  pid:=GetCurrentProcessId;

  h:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, GetCurrentProcessId);
  FillChar(res, sizeof(res),0);
  res.dwSize:=sizeof(res);
  if Process32FirstW(h, res) then begin
    if (res.th32ProcessID<>pid) then
      repeat
      until (res.th32ProcessID=PID) or not Process32NextW(h, res);
    if res.th32ProcessID=PID then
      begin
        GetParentPID := res.th32ParentProcessID;
   Exit;
      end
      //writeln('My Parent PID: ', res.th32ParentProcessID)
    else
      writeln('failed to find my parent!');
  end else
    writeln('failed to find my parent!');
  CloseHandle(h);
  halt(2147483647)
end;

BEGIN
//  if (ParamCount <> 2) or ((ParamStr(1) = '/?') and ((UpCase(ParamStr(1)) <> 'QE') or (UpCase(ParamStr(1)) <> 'QW')))Then
  //  Help;

  MyPID := GetCurrentProcessId;
  PID := GetParentPID;

  case UpCase(ParamStr(1)) of
       'QE' : halt(GetParentPID);
       'QW' : begin
                WriteLN(GetParentPID);
                halt(0)
              end
       Else
         begin
           P := TProcess.Create(nil);
        P.CommandLine := ParamStr(2); //Берем командную строку

        P.Options := P.Options + [poNewConsole];


        P.Execute; // Запускаем приложение
        PID := P.ProcessID;
        P.Free;
  case UpCase(ParamStr(1)) of
       'E' : halt(PID);
       'W' : WriteLN(PID)
  end; // case
         end;
  end; // case
END.

PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Запуск внешнего приложения и закрытие программы

Сообщение bogdan » 15.08.2016 19:24:36

Ваш пример под Windows, а мне нужно под линкус
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Запуск внешнего приложения и закрытие программы

Сообщение rayanAyar » 15.08.2016 19:47:26

Аватара пользователя
rayanAyar
новенький
 
Сообщения: 42
Зарегистрирован: 06.01.2011 08:22:52
Откуда: Новоуральск

Re: Запуск внешнего приложения и закрытие программы

Сообщение bogdan » 16.08.2016 19:17:01

InheritHandles determines whether the created process inherits the open handles of the current process (value True) or not (False).

On Unix, setting this variable has no effect.
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Запуск внешнего приложения и закрытие программы

Сообщение rayanAyar » 16.08.2016 19:34:31

У меня так (как в примере) работает в Windows и Linux.
Аватара пользователя
rayanAyar
новенький
 
Сообщения: 42
Зарегистрирован: 06.01.2011 08:22:52
Откуда: Новоуральск

Re: Запуск внешнего приложения и закрытие программы

Сообщение bogdan » 16.08.2016 20:55:46

У меня при закрытии программы закрывается и программа открытая в TProcess, и тоже все по примеру
bogdan
новенький
 
Сообщения: 40
Зарегистрирован: 20.05.2015 21:32:49

Re: Запуск внешнего приложения и закрытие программы

Сообщение mig-31 » 17.08.2016 13:00:39

AProcess.Options := AProcess.Options + [];
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru