Ant*_*nes 12 .net c# windows-server-2003 .net-3.5
我有一个包含此代码的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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码的目的是在文档上运行IFilter提取,我们使用一个单独的过程,因为一些IFilter是众所周知的片状.
现在,此代码在Windows 7和Server 2008 R2机箱上运行完全正常,但在Windows Server 2003上,会WaitForExit立即抛出"没有与此Process对象关联的进程"异常.该过程确实存在并完成其任务而没有问题.
谁见过这个?任何人都可以解释为什么WaitForExit会出现这个错误?
附加信息
如果我将此代码放在控制台应用程序中并运行它也可以在Windws Server 2003框上正常工作,因此它似乎是在Windows Server 2003框中的服务中运行此代码的特定问题.
Ben*_*Ben 15
在启动进程时,使用System.Diagnostics.Process类,系统可以使用CreateProcess或ShellExecuteExWin32函数.当CreateProcess只使用可执行文件时可以启动.使用时ShellExecuteEx,可以使用shell中的"开始 - >运行"命令启动任何文件.
然而,这些是完全不同的启动过程的方式.ShellExecuteEx涉及shell,例如,可以使用存储在HKCR\<progid>\shell\<verb>注册表项下的信息,重新使用现有的Word或Excel实例来打开文档.这可能涉及例如使用DDE搜索然后激活现有的Excel实例.
查看文档ShellExecuteEx的SHELLEXECUTEINFO:
请注意,ShellExecuteEx根据是否启动了新进程,可能会也可能不会返回hProcess.这是你所看到的行为.
CreateProcess是一个低级函数,直接创建一个进程,并简单地传递等效参数.它总是返回一个进程句柄.
注意:由于您似乎正在启动可执行文件,因此不会hProcess返回任何内容,这有点令人惊讶ShellExecuteEx.不过,如果你想确保获得一个进程句柄,那么使用UseShellExecute = false是正确的.
| 归档时间: |
|
| 查看次数: |
11768 次 |
| 最近记录: |