我有一个包含此代码的Windows服务:
public static void ExtractTextInner(string source, string destination)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = EXTRACTOR_EXE_FILEPATH
startInfo.Arguments = "\"" + source + "\" \"" + destination + "\"";
startInfo.CreateNoWindow = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
int exitCode = process.ExitCode;
process.Close();
if (exitCode != 0)
{
switch (exitCode)
{
case 1:
throw new ApplicationException("IFilter Extraction Failed");
default:
throw new ApplicationException("Unknown Exit Code:" + exitCode.ToString());
}
}
}
此代码的目的是在文档上运行IFilter提取,我们使用单独的过程,因为一些IFilter是众所周知的片状。
现在,此代码在Windows 7和Server 2008 R2上完全运行,但在Windows Server 2003上,WaitForExit
会立即抛出“没有与此Process对象关联的进程”异常。该过程确实存在并且完成其任务没有问题。
有人见过这个吗?任何人都可以解释为什么WaitForExit会出现这个错误吗?
其他信息
如果我将此代码放在控制台应用程序中并运行它也可以在Windws Server 2003框上正常工作,因此它似乎是在Windows Server 2003框中的服务中运行此代码的特定问题。
答案 0 :(得分:15)
使用System.Diagnostics.Process
类启动进程时,系统可以使用CreateProcess
或ShellExecuteEx
Win32函数。使用CreateProcess
时,只能启动可执行文件。使用ShellExecuteEx
时,可以使用shell中的“开始 - >运行”命令启动任何文件。
然而,这些是完全不同的启动过程的方式。 ShellExecuteEx涉及shell,例如,可以使用存储在HKCR\<progid>\shell\<verb>
注册表项下的信息,重新使用现有的Word或Excel实例来打开文档。这可能涉及例如使用DDE搜索并激活现有的Excel实例。
请参阅ShellExecuteEx
的{{1}}上的文档:
请注意,SHELLEXECUTEINFO
可能会也可能不会返回hProcess,具体取决于是否启动了新进程。这是你所看到的行为。
ShellExecuteEx
是一个低级函数,可直接创建一个进程,只需传递等效参数即可。它总是返回一个进程句柄。
注意:由于您似乎正在启动可执行文件,因此CreateProcess
不会返回hProcess
,这有点令人惊讶。不过,如果您想确保获得流程处理,使用ShellExecuteEx
是正确的做法。