运行以下代码时,GetWindowThreadProcessId
返回 0。我读过关于服务发生的相同问题,但此代码在 IIS 中作为应用程序池运行(即 w3wp.exe)。此外,它试图杀死的 w3wp.exe 和 EXCEL.EXE 都在同一个会话(会话 0)中运行,并且作为同一个用户。
if (appClassXls != null)
{
IntPtr processId = default(IntPtr);
GetWindowThreadProcessId(appClassXls.Hwnd, out processId);
Process processXls = Process.GetProcessById(processId.ToInt32());
if (processXls != null)
{
processXls.Kill();
}
}
显然,此代码失败,因为它将尝试杀死 pid 0,这是系统空闲进程,而不是它试图杀死的 Excel 应用程序实例。为什么GetWindowThreadProcessId
在与同一用户相同的会话中从 w3wp.exe 调用时会返回 0?以及如何让它返回正确的 pid?
Windows Server 2008 R2 Standard(64 位)IIS 7.5 .NET Framework v4.0 Microsoft Office Professional Plus 2010(全新安装,设置为在 DCOM 设置中作为特定用户启动,由 w3wp.exe 启动)
更新(2011-02-17 08:33 UTC):我刚刚意识到 w3wp.exe 是由“svchost.exe -k iissvcs”启动的,它对应于“万维网发布服务”和“Windows 进程激活服务”而EXCEL.EXE是由对应“DCOM Server Process Launcher”的“svchost.exe -k DcomLaunch”启动的,这3个都是服务。两个 svchost.exe 都在会话 0 中作为 SYSTEM 运行,所以我仍然不明白为什么他们或他们的孩子会在访问对方时遇到问题。