Закройте, полностью уничтожьте MainForm после shellexecute - Delphi

Мне нужно разработать программу запуска для exe-файла, но у меня проблемы с закрытием основной формы.

Я хочу оставить исполняемый файл открытым, но закрыть форму. Я добился успеха с выполнением приложения, исполняется .exe и форма «закрывается» после открытия .exe. Это почти то, что я хотел, но launcher.exe все еще активен в диспетчере задач Windows.

Это процедура для запуска .exe:

procedure TForm2.LancerVersion(aExe: String);
var
  SEInfo: TShellExecuteInfo;

begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
  begin 
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(aExe);
    nShow := SW_SHOWNORMAL;
  end;    
  ShellExecuteEx(@SEInfo);
  if Blight then
   begin
    free;
    Close; **//HERE I WOULD LIKE TO CLOSE CLEANLY MY FORM**
   end 
  else
   hide;
end;

Это обычная процедура закрытия:

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    if BClose then
    begin
      Canclose := false;
      Bshow := false;
    end;
    Canclose := true; **//IT GOES HERE AFTER CLOSE IS CALLED**
end;

Я написал эту настраиваемую процедуру, потому что иногда я просто хочу скрыть форму в значке на панели задач в зависимости от параметра, когда мы нажимаем кнопку окна X. Итак, не обращайте внимания на первое условие «если Bclose, то».

Я позаботился о том, чтобы освободить весь свой объект в FormDestroy, который я создал в FormCreate, но делать нечего, процесс сохраняется ...

Буду признателен, если вы мне поможете, или если вы посмотрите на мою проблему. Заранее спасибо..


person BzhProg    schedule 04.07.2014    source источник
comment
Вы должны использовать CreateProcess, чтобы иметь возможность закрыть host приложение после запуска из него другого процесса.   -  person LightBulb    schedule 04.07.2014
comment
Application.Terminate должен это сделать. Показывать весь ShellExecute код бессмысленно, поскольку он не имеет ничего общего с реальной проблемой (хотя при этом обнаруживается утечка дескриптора процесса). Пожалуйста, постарайтесь сократить это до минимума, необходимого для иллюстрации проблемы. Это помогает всем, особенно вам. Звонок Free на Self - почти всегда катастрофа. Сделайте это, и вы превратитесь в настоящую дыру. Подумайте, что произойдет, когда Free вернется?   -  person David Heffernan    schedule 04.07.2014
comment
Спасибо за ваши быстрые ответы и извините за мой плохой английский. Я только что протестировал [code] CreateProcess, но возникла та же проблема. Я также удалил [code] Free, но это не решило того факта, что процесс работает в фоновом режиме.   -  person BzhProg    schedule 07.07.2014


Ответы (1)


Вот небольшой рабочий SSCCE:

procedure TForm1.Button1Click(Sender: TObject);

var
  SEInfo: TShellExecuteInfo;
  ExecuteFile: string;

begin
  ExecuteFile := 'notepad.exe';
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
  begin
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    nShow := SW_SHOWNORMAL;
  end;
  Win32Check(ShellExecuteEx(@SEInfo));
  Close;
end;

Проблема заключается в том, что вы вызываете Free в своей процедуре, не делайте этого.

person whosrdaddy    schedule 04.07.2014
comment
Вы также скопировали утечку ручки в вопросе. Снимите SEE_MASK_NOCLOSEPROCESS или закройте ручку. И некоторая проверка ошибок на ShellExecuteEx была бы хорошей. Оберните его в Win32Check. - person David Heffernan; 04.07.2014
comment
Все в порядке. Я просто добавляю это для всех читателей. Вы действительно решаете ключевой вопрос. - person David Heffernan; 04.07.2014
comment
Мне никогда не нужно устанавливать CloseAction внутри MainForm. И CanClose, как известно, true по умолчанию. - person Sir Rufo; 04.07.2014
comment
На самом деле рассматриваемый код, похоже, не использует OnClose. Я не могу понять, почему вы все равно предлагаете это реализовать. - person Sertac Akyuz; 04.07.2014
comment
Дэвид Хеффернан, я проверил ваш совет, но нечего делать, он все еще активируется в фоновом режиме. И, сэр Руфо, да, CanClose, как известно, используется по умолчанию. Я удалил это. - person BzhProg; 07.07.2014
comment
Я забыл уточнить, я работаю на VirtualMachine с VirtualBox. Это что-то меняет в жизни приложения? - person BzhProg; 07.07.2014