【发布时间】:2011-02-17 03:31:09
【问题描述】:
运行以下代码时,GetWindowThreadProcessId 返回 0。我已经阅读了有关 the same problem happening with a service 的信息,但此代码在 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 标准版(64 位) IIS 7.5 .NET 框架 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 是由“svchost.exe -k”启动的DcomLaunch”对应“DCOM Server Process Launcher”,这3个都是服务。虽然这两个 svchost.exe 在会话 0 中都以 SYSTEM 身份运行,所以我仍然不明白为什么他们或他们的孩子会在相互访问时遇到问题。
【问题讨论】:
-
鉴于您试图杀死的进程是无头的,我不明白为什么这会起作用。
-
你能看到 appClassXls.Hwnd 是什么吗?
-
GetWindowThreadProcessId 是否返回有效的线程 ID?如果没有,也许 appClassXls.Hwnd 有问题
-
@OJ 为什么不能杀死一个无头进程?
-
@OJ、Winston 和 Ken:完全相同的代码适用于具有相同操作系统的其他机器,因此逻辑应该没问题。这更有可能是配置问题。
标签: c# .net-4.0 iis-7.5 windows-server-2008-r2 excel-2010