从Delphi通过命令行启动应用程序后关闭CMD窗口
我正在努力做到以下几点。它可以工作,但cmd窗口会在退出之前等待acrobat.exe完成执行。我必须使用这种启动方法,因为我打算在将来传递某些命令行参数从Delphi通过命令行启动应用程序后关闭CMD窗口,delphi,delphi-xe5,Delphi,Delphi Xe5,我正在努力做到以下几点。它可以工作,但cmd窗口会在退出之前等待acrobat.exe完成执行。我必须使用这种启动方法,因为我打算在将来传递某些命令行参数 cmdLineString := Format('/c ""%s" "%s""',['C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', 'F:\Android-interview\Packt.Android.3.0.Application.Development.C
cmdLineString := Format('/c ""%s" "%s""',['C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', 'F:\Android-interview\Packt.Android.3.0.Application.Development.Cookbook.Jul.2011.ISBN.1849512949.pdf']);
ShellExecute(Handle, 'open', 'cmd.exe', PChar(CmdLineString), nil, SW_SHOWNORMAL);
有许多方法可以改善这一点:
ShellExecute
。这样做很有诱惑力,因为打电话很简单。但是,它不是很灵活。改用CreateProcess
李>
CREATE\u NO\u window
标志传递给CreateProcess
李>
cmd
。您不需要创建一个创建另一个流程的流程。这样做实际上会使传递论点变得更加困难。直接创建Acrobat进程。去掉中间人李>
有许多方法可以改善这一点:
ShellExecute
。这样做很有诱惑力,因为打电话很简单。但是,它不是很灵活。改用CreateProcess
李>
CREATE\u NO\u window
标志传递给CreateProcess
李>
cmd
。您不需要创建一个创建另一个流程的流程。这样做实际上会使传递论点变得更加困难。直接创建Acrobat进程。去掉中间人李>
正如David所回答的,在回答了一些关于
CreateProcess
的其他问题之后,解决方案代码最终看起来如下所示。为其他像我这样的初学者准备的。想想看,用这段代码,所有的事情都是可能的!谢谢你,德尔菲
procedure TForm.btnCMDLaunchClick(Sender: TObject);
var
commandLine: string;
si: TStartupInfo;
pi: TProcessInformation;
begin
commandLine := Format('%s %s',['C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', 'F:\Android-interview\Packt.Android.3.0.Application.Development.Cookbook.Jul.2011.ISBN.1849512949.pdf']);
UniqueString(commandLine);
si := Default(TStartupInfo);
si.cb := sizeof(si);
if CreateProcess(
PChar(nil), //no module name (use command line)
PChar(commandLine), //Command Line
nil, //Process handle not inheritable
nil, //Thread handle not inheritable
False, //Don't inherit handles
0, //No creation flags
nil, //Use parent's environment block
PChar(nil), //Use parent's starting directory
si, //Startup Info
pi //Process Info
) then begin
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
正如David所回答的,在回答了一些关于
CreateProcess
的其他问题之后,解决方案代码最终看起来如下所示。为其他像我这样的初学者准备的。想想看,用这段代码,所有的事情都是可能的!谢谢你,德尔菲
procedure TForm.btnCMDLaunchClick(Sender: TObject);
var
commandLine: string;
si: TStartupInfo;
pi: TProcessInformation;
begin
commandLine := Format('%s %s',['C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe', 'F:\Android-interview\Packt.Android.3.0.Application.Development.Cookbook.Jul.2011.ISBN.1849512949.pdf']);
UniqueString(commandLine);
si := Default(TStartupInfo);
si.cb := sizeof(si);
if CreateProcess(
PChar(nil), //no module name (use command line)
PChar(commandLine), //Command Line
nil, //Process handle not inheritable
nil, //Thread handle not inheritable
False, //Don't inherit handles
0, //No creation flags
nil, //Use parent's environment block
PChar(nil), //Use parent's starting directory
si, //Startup Info
pi //Process Info
) then begin
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
此代码不检查两个句柄是否存在错误和泄漏。si、pi最终需要为free和nil,fileexist errors?否。您需要检查返回值是否存在错误,如果成功,请将进程和线程句柄传递给CloseHandle。文档中对此进行了解释。是的,现在就是这样。此代码不检查错误和泄漏两个句柄。si、pi最终需要为Free和Nil,fileexist错误?否。您需要检查返回值是否存在错误,如果成功,请将进程和线程句柄传递给CloseHandle。文档中已经解释过了。是的,就是这样。