在什么情况下Process.Start()方法返回false?

时间:2015-10-09 15:25:21

标签: c# .net

来自MSDN

  

返回值true表示新的进程资源    开始。 如果FileName成员指定的进程资源    StartInfo属性已在计算机上运行,没有    启动其他流程资源。相反,运行过程    资源被重用并返回false。

尝试这样的事情:

var info = new ProcessStartInfo {FileName = @"CMD"};

var p1 = new Process
{
     StartInfo = info
};

var result = p1.Start(); //true
result = p1.Start(); //true

var p2 = new Process
{
    StartInfo = info
};

result = p2.Start(); //true

如果我使用FilePath = @"c:\myapp.exe"代替CMD,则会得到相同的结果。

在什么情况下会返回false

1 个答案:

答案 0 :(得分:11)

如果您查看参考来源,您会看到Process.Start如何运作:

http://referencesource.microsoft.com/System/R/c50d8ac0eb7bc0d6.html

这是调用Process.Start时调用的两种方法之一。请注意底部附近返回值true或false。只有在启动进程后,它无法获取已启动进程的句柄,才会返回False。

要开始此过程,请使用NativeMethods.CreateProcess,您可以在此处找到来源:http://referencesource.microsoft.com/System/compmod/microsoft/win32/NativeMethods.cs.html#9c52a5ca5f3eeea3

这只是Kernel32.CreateProcess的方法原型,其API可在此处找到:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx

如果查看返回值,则说:

  

如果函数成功,则返回值为非零。   如果函数失败,则返回值为零。

我在CreateProcess的API中找不到任何说明如果请求的进程已经运行就失败的内容,可能是因为它是单实例应用程序(如Outlook)而无法启动,然后它可能会失败,但对于像命令提示符这样的多个实例应用程序,它应该不会无法创建进程的句柄。

所以,在说了这么多之后,有可能MSDN文档不完全正确,我没有你的链接,但对于Process.Start(StartInfo),MSDN说这个关于返回值:< / p>

  

与流程资源关联的新流程,如果未启动流程资源,则为null。 请注意,与已经运行相同进程的实例一起启动的新进程将独立于其他进程。此外,Start可能会返回一个非空进程,其HasExited属性已设置为true。在这种情况下,启动的进程可能已激活其自身的现有实例,然后退出。

(我强调的重点)。它并没有说如果它已经运行,它将失败。

对于Process.Start(),它说:

  

返回值   键入:System.Boolean   如果启动了进程资源,则为true;如果没有启动新的进程资源,则返回false(例如,如果重用现有进程)。

所以它说如果重用现有流程,这完全取决于正在启动的应用程序或启动它的方法。