我必须为exe文件开发一个启动程序,但是我在关闭mainform时遇到了一些麻烦。
我想继续打开可执行文件但关闭表单。 我通过执行应用程序取得了成功,执行了.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那么"。
我确保自己释放我在FormCreate中创建的FormDestroy中的所有对象,但没有任何事情可做,该进程仍然存在......
如果你能帮助我,或者只是看看我的问题,我会感激不尽。 提前谢谢..
答案 0 :(得分:2)
这是一个小型的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
,不要这样做。