【问题标题】:How can I get the ProcessID (PID) for a hidden Excel Application instance如何获取隐藏的 Excel 应用程序实例的 ProcessID (PID)
【发布时间】:2016-06-05 00:31:51
【问题描述】:

我有一个Microsoft.Office.Interop.Excel.Application 的实例。为了确保EXCEL.EXE 进程及时终止,我需要找到在创建Application 对象时实例化的ProcessID。

当 Excel Application 有一个窗口时,我为此找到了 samples

对于“隐藏”实例,即没有窗口绑定到 EXCEL.EXE 进程时,即未设置 excelApp.Hwnd 时,有没有办法做到这一点?

【问题讨论】:

  • 你从哪里得到Microsoft.Office.Interop.Excel.Application
  • 我在我的代码中创建了Microsoft.Office.Interop.Excel.Application 的实例,它被我的代码使用。在我处理它之后,我需要避免孤立的EXCEL.EXE。大多数时候这不是问题,因为我使用所有已知策略来正确释放所有 COM 引用。但这还不够。我需要一种警报技术,如果我失败了,它会让我知道。
  • 我从未见过没有设置Excel.Application的Hwnd的情况。您能否展示一些示例代码,如何在不设置 Hwnd 的情况下生成 Excel.Application?
  • 无法找出实现接口的进程是 COM 的基础。一个可怕的场景是你接下来要做什么,假设你可以得到 PID。 Process.Kill() 在 Office 程序上是一个非常非常非常的坏主意。当您再次启动它时,您将触发自动恢复代码,绝不会在互操作场景中发生您希望发生的事情。解决真正的问题,不要攻击症状。一个微不足道的,GC.Collect + GC.WaitForPendingFinalizers 总是足够好。你只需要把它放在正确的地方。
  • @HansPassant 谁说我要杀死孤儿进程?我说过吗?不要以自己为标准来评判别人。我需要DETECT orp​​haned process 的答案并建立一个警报说:“有问题需要注意”。

标签: c# excel winapi


【解决方案1】:

Application.Hwnd 有一个有效的窗口句柄,即使应用程序没有可见的工作簿窗口,您也可以使用它来获取相关 Excel 应用程序的进程。

[DllImport("user32.dll")]
static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);

Process GetExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
     int id;
     GetWindowThreadProcessId(excelApp.Hwnd, out id);
     return Process.GetProcessById(id);
}

void TerminateExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
     var process = GetExcelProcess(excelApp);
     if (process != null)
     {
          process.Kill();
     }
}

private void button1_Click(object sender, EventArgs e)
{
     // Create Instance of Excel
     Microsoft.Office.Interop.Excel.Application oXL = new Microsoft.Office.Interop.Excel.Application();
     try
     {
          // Work with oXL
     }
     finally
     {
          TerminateExcelProcess(oXL);
     }
}

注意:这个question 有一些答案解释了为什么当您通过自动化从 C# 完成使用 Excel 进程时不会终止(除非您非常迂腐地确保释放对您使用的任何对象的每个引用明确)。

【讨论】:

  • 你的意思是对于从 ASP.NET w3wp 进程和非交互式会话(session-0)(如 Windows 服务进程)创建的 excel 实例来说,这是真的事件吗?
  • 是的。只要你能成功创建自动化对象,它就会有一个有效的窗口句柄。
  • 感谢您的好消息。我将花时间进行测试,并接受成功的答案。
猜你喜欢
  • 2014-11-11
  • 2012-05-04
  • 2011-02-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多