【问题标题】:Excel 2007 Zombie Process not COM automation but w/ references to 3rd party com objectsExcel 2007 Zombie Process 不是 COM 自动化,而是带有对 3rd 方 com 对象的引用
【发布时间】:2012-11-10 01:23:03
【问题描述】:

我正在开发一个在前端使用 Excel 并通过 COM 上的第 3 方 API 访问远程数据的应用程序。该应用程序直接在 Excel VBA 中编码(即 Excel 没有 COM 自动化。)有时,在运行我的应用程序后,用户退出时 Excel 不会退出,从而创建一个消耗约 50% CPU 的僵尸 Excel。

我已经在 SO 上阅读了现有的“Excel 不会退出”答案——它们似乎都与 Excel 的互操作/COM 自动化有关。关于在这种情况下如何确保 Excel 退出的任何建议?

【问题讨论】:

  • 你能发布你用来退出应用程序的代码吗?如果您通过 VBA 退出,您应该能够确保 excel 正确终止。如果没有您的代码,我很难猜出问题可能是什么。
  • 可能存在对 Excel 的 Application 对象、工作簿或电子表格等的远程引用。
  • 我没有在我的代码中退出应用程序。当用户通过关闭最后打开的工作簿或通过菜单使用退出手动退出 Excel 时,Excel 似乎退出,但有时会留下僵尸实例运行。在这种情况下,当用户下次打开 excel 时,将有两个实例在运行,每个实例都消耗约 50% 的 CPU。僵尸 excel 显示在 Windows 任务管理器的进程列表中,但不在应用程序列表中,并一直存在,直到它被强制退出。

标签: com excel excel-2007 vba


【解决方案1】:

我开始相信我的代码创建的 COM 对象没有被正确处理,从而导致 Excel 无法完全退出。我试图强迫他们释放,导致了这个问题:How can I call System.Runtime.InteropServices.Marshal.ReleaseComObject from within an Excel 2007 VBA module——引用answer (also includes related links worth checking out):

当您希望 Excel 退出时,您确定要删除对 COM 对象的所有引用吗?确保为您持有的 COM 对象的每个引用放置如下行:

obj = Nothing ' Where "obj" is a reference to the COM object

如果这不能解决问题,那么问题也可能是循环引用。 COM 对象是否存储了对您的 VBA 对象的引用,而 VBA 对象又持有对 COM 对象的引用?如果是这样,将创建循环引用并且永远不会释放对象。

我现在怀疑循环引用。如果在工作簿关闭事件中将某些 COM 对象属性设置为 Nothing 之前问题消失,然后将对象本身设置为 Nothing,我会回来并将其标记为已接受的答案。

更新

仔细设置对Nothing 的对象引用并不能解决问题。我最终创建了一个COM visible dll wrapper for System.Runtime.InteropServices.Marshal.FinalReleaseComObject。在 Workbook BeforeClose 事件中对 COM 对象调用 dispose 似乎已经解决了该问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2023-03-08
    • 2011-08-22
    • 2011-05-08
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多