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

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

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

Ответить
bogdan
новенький
Сообщения: 40
Зарегистрирован: 20.05.2015 20:32:49

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

Сообщение bogdan »

Здравствуйте! Не подскажите как запустить внешнее приложение и оставить его запущенным при закрытии программы. Ubuntu-Mate 16.04 и Lazarus 1.6.
В примере идет открытие виртуальной клавиатуры, но при закрытии программы, она закрывается, нужно оставлять ее запущенной, есть ли варианты решения данной проблемы?

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

  
// Процесс запуска
ProcessRun := TProcess.Create(nil);     
ProcessRun.commandline := 'onboard';   
ProcessRun.execute();
Sleep(1000);   
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Пример готового кода:

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

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.

bogdan
новенький
Сообщения: 40
Зарегистрирован: 20.05.2015 20:32:49

Сообщение bogdan »

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

Сообщение bogdan »

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.
Аватара пользователя
rayanAyar
новенький
Сообщения: 42
Зарегистрирован: 06.01.2011 07:22:52
Откуда: Новоуральск

Сообщение rayanAyar »

У меня так (как в примере) работает в Windows и Linux.
bogdan
новенький
Сообщения: 40
Зарегистрирован: 20.05.2015 20:32:49

Сообщение bogdan »

У меня при закрытии программы закрывается и программа открытая в TProcess, и тоже все по примеру
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

AProcess.Options := AProcess.Options + [];
Ответить