【问题标题】:How do I prevent "end process tree" from terminating the programs mine has started?如何防止“结束进程树”终止我已经启动的程序?
【发布时间】:2012-05-15 16:28:25
【问题描述】:

我正在尝试使用 ShellExecute 从 Delphi XE2 中的另一个应用程序“one.exe”执行 EXE“two.exe”。

ShellExecute(0, 'open', 'two.exe', nil, nil, SW_NORMAL);

它运行良好,但每当我从任务管理器的进程选项卡中使用“结束进程树”选项终止应用程序“one.exe”(父应用程序)时,应用程序“two.exe”也会终止。

如何防止我的 ShellExecuted 应用程序像这样被终止?

【问题讨论】:

  • 我无法重现您的解释...就像您解释的那样:ShellExecute(Application.Handle, 'open', PWideChar(ExtractFileName(Application.ExeName)), nil, PWideChar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL); 不要杀死其他实例...ShellExecute(0, 'open', PWideChar(ExtractFileName(Application.ExeName)), nil, PWideChar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL);
  • 您确定两个应用程序之间没有其他交互会导致第二个应用程序在第一个应用程序关闭时关闭吗?
  • 我可以重现它。完全如问题中所述。在 Process Explorer 中有一个流程视图,可以清楚地显示组层次结构。
  • @DavidHeffernan:我同意 Process Explorer.. 但是对于常规的 TaskManager,当我结束进程树时,如果我的第一个参数是 0,它不会杀死我的子应用程序......跨度>
  • +1。就像一个注释:除非您确定文件扩展名的文件关联具有指定的特定动词,否则不要使用一个。 (例如,HKCR 中的 .exe 没有open 动词,它有run。你不应该使用open。)当你想要默认操作发生时,只需使用nil,并且让 Windows 弄清楚该怎么做;它会自动打开Word文档(.doc)文件,运行可执行文件等

标签: delphi delphi-xe2


【解决方案1】:

好的,不是很好的解决方案...但测试成功;o)

ShellExecute(0, 'open', 'cmd', 
  PChar('/C  start "" "' + Application.ExeName + '"'), nil, SW_HIDE);

第一个是手动启动...他的孩子定期调用 shellexecute... 最后一个,用shellexecute + cmd 技巧...

/C explanation

【讨论】:

  • 这是我回答中方法的一个实现。我猜,缺点是命令窗口会闪烁一秒钟。
  • 是的,这是对你解释的一种实现......但我发誓我没有复制......当你发布它并在之后看到它时我正在测试它;o)
  • 哦,我不是故意的。我只是想解释一下这种技术是如何工作的。
  • @Tlama 对,我现在明白了。
  • @Whiler 我在代码中添加了一些内容,以便它可以处理名称中包含空格的程序。顺便说一下 +1。
【解决方案2】:

我认为您需要创建一个中间过程,该过程反过来产生two.exe。然后您需要立即终止中间进程,此时原始进程与two.exe 之间的关系被破坏。

【讨论】:

  • 经过一些没有结果的搜索,我同意,因为我认为不可能更新 Process Explorer 可能使用的th32ParentProcessID...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2011-01-12
  • 2011-02-03
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多