2013-01-22 27 views
2

我正在为嵌入式系统编写看门狗服务,该进程监视某些专有进程并在必要时重新启动它们。 (没有做恶意软件,我可以告诉大家,这只是一个业务需求)在启动后为进程获取友好名称

我需要从我刚刚创建过程检索友好的名字,这样以后我可以检索使用,这一进程名称,以监测其健康状况。

我的问题是:

  • 如果我尝试Process.Start()之后读Process.ProcessName,我得到一个InvalidOperationException,因为它的进程还没有完全建立呢。

  • 如果我使用Process.WaitForInputIdle(),则会发生同样的情况,但由于这需要消息泵,并且许多可执行文件可能是实际应用程序的无UI发射器,因此这可能不是一种选择。

  • 需要在创建过程之后,在做任何事情之前立即获得友好名称。

这里有一个代码片段:

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" }; 
var process = new Process(); 
process.StartInfo = startInfo; 
process.Start(); 
process.WaitForInputIdle(); 
var friendlyName = process.ProcessName; 

这将在最后一行抛出InvalidOperationException如果正在启动过程中是火狐,例如。

那么我该怎么做呢?有没有更安全的方法?

编辑:添加了一个代码片段澄清。编辑2:改写整个问题的澄清,留下无关紧要的东西。

+0

受监视的进程是否启动消息泵?如果不是,'WaitForInputIdle'根本不会做任何事情。也许你可以使用Process.MainModule来找到可执行文件的名字? – Jon

+0

想到了,是的。但在我的测试案例中,这个过程就是Firefox。 –

+0

你的意思是'Process.MainModule.ModuleName'?它总是返回与“Process.ProcessName”相同的值吗? –

回答

4

好吧,经过大量的研究后,我不得不采取一种有点冒险的解决方案。

根据Process.GetProcessesByName()文档“进程名称是过程的友好名称,如Outlook,不包含.exe扩展名或路径。”“。

考虑到这一点,我工作围绕使用此代码的问题:

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" }; 
var process = new Process(); 
process.StartInfo = startInfo; 
process.Start(); 
var friendlyName = Path.GetFileNameWithoutExtension(startInfo.FileName); 

正如我所说的,它仍然感觉有点哈克,但至少它得到了这份工作做,让我继续前进。

感谢您的所有意见!

0

你缺少代码中的一些关键的东西,并使用NotePad.exe尝试这样的事情,你会看到什么,我说什么

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" }; 
var process = new Process(); 
process.StartInfo = startInfo; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = false; 
process.Start(); 
process.WaitForInputIdle(); 
// this line below will always be false because `process.ProcessName will be 
//notepad and process.StartInfo.FileName = notepade.exe 
if (process.ProcessName.Equals(process.StartInfo.FileName) == false) 
{ 
    var theConfiguredProcessName = process.ProcessName; 
} 

,你可以做任何的未来2个东西下面

另一种选择
Process[] processName = Process.GetProcessesByName("blah.exe"); 

或检查的所有进程运行,并检查你正在运行的进程

Process[] processlist = Process.GetProcesses(); 
foreach(Process process in processlist) 
{ 
    Console.WriteLine("Process: {0} ID: {1}", process.ProcessName, process.Id); 
} 
+0

我明白你的意思,但我不认为就是这样。实际上,比较甚至没有执行,因为只是访问'进程。ProcessName'会引发异常,因为它尚不可用。此外,问题的目标是验证这个价值。所以我开始这个过程,如果它与实际的ProcessName不匹配,我纠正它。 –

+0

显示你正在从配置文件中读取的代码..如果它确实得到了值..那么你需要附加文件扩展名,也许我访问process.ProcessName它的作品就是这个目的..我建议把突破点并且当你看到startInfo = new ProcessStartInfo'行时,查看startInfo时的FileName的值,通过代码 – MethodMan

+0

正如我所说的,值是无关紧要的,因为我试图验证并纠正它。我想你可能误解了这个问题。 –