运行以下代码时,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 Application实例。为什么在同一用户的同一会话中从w3wp.exe调用时,GetWindowThreadProcessId会返回0?我如何让它返回正确的pid呢?
Windows Server2008DCOM标准版(64位)IIS7.5DCOM框架v4.0 Microsoft R2 Professional Plus2010(全新安装,设置为在.NET设置中以特定用户身份启动,由w3wp.exe启动)
更新(2011-02-17 08:33UTC):我刚刚意识到w3wp.exe是由"svchost.exe -k iissvcs“启动的,对应的是”万维网发布服务“和"Windows进程激活服务”,而EXCEL.EXE是由"svchost.exe -k DcomLaunch“启动的,这3个都是服务。不过,这两个svchost.exe都是在会话0中以系统身份运行的,所以我仍然不明白为什么他们或他们的孩子在相互访问时会遇到问题。
发布于 2011-02-17 11:59:48
请参阅此blog entry,它解释了会话0隔离是如何工作的。看起来服务和应用程序不能相互通信。我正在尝试弄清楚“会话0”是如何分配的。我相信分配给w3wp的窗口站与它启动的excel的窗口站不同(我假设)。
我建议避免从web应用程序启动excel。这样做可以很容易地挂起服务器。我记得有几个问题是由于excel上的引用计数泄漏导致的,导致内存问题,最终导致服务器的死亡。:)
https://stackoverflow.com/questions/5024788
复制相似问题