C# 为什么从w3wp.exe调用GetWindowThreadProcessId时返回0

C# 为什么从w3wp.exe调用GetWindowThreadProcessId时返回0,c#,.net-4.0,iis-7.5,windows-server-2008-r2,excel-2010,C#,.net 4.0,Iis 7.5,Windows Server 2008 R2,Excel 2010,运行以下代码时,GetWindowThreadProcessId返回0。我读过,但这段代码是作为IIS(即w3wp.exe)中的应用程序池运行的。此外,w3wp.exe及其试图终止的EXCEL.exe都在同一会话(会话0)中以同一用户身份运行 if (appClassXls != null) { IntPtr processId = default(IntPtr); GetWindowThreadProcessId(appClassXls.Hwnd, out processId)

运行以下代码时,
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,pid 0是系统空闲进程,而不是它试图杀死的Excel应用程序实例。当与同一用户在同一会话中从w3wp.exe调用时,
GetWindowThreadProcessId
为什么返回0?如何使其返回正确的pid

Windows Server 2008 R2标准(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是由“svchost.exe-k DcomLaunch”启动的,它对应于“DCOM服务器进程启动器”,这三个都是服务。不过,这两个svchost.exe都在会话0中作为系统运行,因此我仍然不明白为什么它们或它们的子对象在访问彼此时会遇到问题。

请参阅这篇文章,其中解释了会话0隔离的工作原理。看起来服务和应用程序无法相互通信。我正在试图弄清楚“会话0”是如何分配的。我相信w3wp被分配到的窗口站与它启动的excel(我假设)的窗口站不同


我建议避免从web应用程序启动excel。您可以轻松地挂起服务器来执行此操作。我记得有几个问题是由于excel上的引用计数泄漏导致内存问题,最终导致服务器崩溃。:)

考虑到您试图杀死的进程是无头的,我不明白为什么这样做会起作用。您能看到appClassXls.Hwnd是什么吗?GetWindowThreadProcessId是否返回有效的线程id?如果没有,可能appClassXls有点可疑。Hwnd@OJ为什么杀死一个无头进程不起作用呢?@OJ、Winston和Ken:完全相同的代码在具有相同操作系统的其他机器上工作,所以逻辑应该是好的。更可能是配置问题。是的,您正确地假设w3wp启动了excel。但是,如果“每个会话都与自己的交互式窗口站相关联”(),并且w3wp.exe和EXCEL.exe都在会话0中,则它们应该共享同一窗口站。而且,w3wp.exe不是服务,是吗?服务与我的问题有关吗?另外,感谢您的推荐,我知道从web应用程序启动excel的风险,Microsoft不支持它。不幸的是,这是我现在最好的选择。注意=)系统上的窗口句柄是否正确?如果它在其他机器上工作,则可能是权限问题。appClassXls.Hwnd是131802。。。它看起来有效。有什么想法吗?另外,启动用户是UAC关闭的全面管理员,因此我不知道w3wp作为同一用户运行时会出现什么特权问题(即,您是否将应用程序池的网络服务用户更改为特定用户?),excel.exe是否设置为以“启动用户”的权限运行?只是确保这些是有效的。如果这些都是正确的,您可以使用不同的方法(GetProcessByName)并查看是否得到不同的结果。如果您尝试过这些,我向您道歉。:)