0

运行以下代码时,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 运行,所以我仍然不明白为什么他们或他们的孩子会在访问对方时遇到问题。

4

1 回答 1

1

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

我建议避免从 Web 应用程序启动 excel。您可以轻松地挂起服务器。我记得由于 excel 上的引用计数泄漏导致内存问题最终导致服务器消亡的几个问题。:)

于 2011-02-17T03:59:48.497 回答