Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Delphi通过命令行启动应用程序后关闭CMD窗口_Delphi_Delphi Xe5 - Fatal编程技术网

从Delphi通过命令行启动应用程序后关闭CMD窗口

从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

我正在努力做到以下几点。它可以工作,但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.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。文档中已经解释过了。是的,就是这样。