【发布时间】:2014-07-04 12:57:37
【问题描述】:
我必须为 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 窗口的按钮时将表单隐藏在参数函数中的托盘图标中。所以,不要关心第一个条件“if Bclose then”。
我确保自己释放了我在 FormCreate 中创建的 FormDestroy 中的所有对象,但无事可做,进程持续存在......
如果您能帮助我,或者您看看我的问题,我将不胜感激。 提前谢谢你..
【问题讨论】:
-
您必须使用CreateProcess 才能在您启动另一个进程后关闭
host应用程序。 -
Application.Terminate应该完成它。显示所有ShellExecute代码是没有意义的,因为它与实际问题无关(尽管这样做确实表明您泄漏了进程句柄)。请尝试将其减少到说明问题所需的最低限度。这对每个人都有帮助,尤其是你。在Self上调用Free几乎总是一场灾难。这样做,你就会把自己画成一个真正的洞。想想当Free返回时会发生什么? -
感谢您的快速回答,并为我的英语不好感到抱歉。我刚刚使用 [code]CreateProcess 进行了测试,但出现了同样的问题。我还删除了 [code]Free,但它并没有解决进程在后台运行的事实。
标签: forms delphi destroy forceclose