【发布时间】:2011-04-06 22:33:16
【问题描述】:
我错过了 Excel.Application.Quit 或 Excel.Application.BeforeQuit 事件。 有人知道模仿这些事件的解决方法吗?
我通过 COM Interop 从 C# WinForms 应用程序访问 Excel。给定一个Excel.Application 对象,我该怎么做:
- 最好防止 Excel 退出?
- 如果无法做到这一点,我如何才能在 Excel 退出时至少通知?
请注意:由于我有一个对Excel.Application 的 COM 引用,当 Excel 处于“退出”状态时,Excel 进程不会退出 "由用户。虽然这听起来很矛盾,但事实就是如此。 “退出”是指用户点击窗口右上角的“退出”或“十字按钮”。窗口关闭,文件被卸载,加载项被卸载,除了我不知道的东西之外,Excel 所做的任何事情。但是我仍然可以使用Application 对象来“恢复”该过程并使 Excel 再次可见,尽管加载项随后丢失了,而且我不确定还有什么处于未定义状态。
为了摆脱这个问题,我想一开始就取消退出(想想BeforeQuitCancel = true,如果它存在的话),或者至少在 Excel 退出时得到通知,所以我可以释放COM对象,让进程真正退出,下次再需要Excel的时候就知道需要先启动了。
不幸的是,这是一个恶性循环:只要 Excel 运行,我就需要 COM 对象。所以我不能在 Excel 退出之前处理它们。另一方面,只要 COM 对象存在,即使 Excel 假装退出进程也不会退出,所以我不能等待进程退出事件或类似事件。
我有一种不愉快的感觉,我要把头撞在砖墙上......
【问题讨论】:
-
请用枕头,众所周知砖块很硬:)
-
是否可以监控 Process.Exit 事件,如果用户手动关闭 Excel 则以隐藏状态重新启动?
-
@Marko:你的意思是我根本不应该使用 Excel? :-) / :-(
-
@Mikael:我刚刚意识到:不,这不是一个选项,因为进程根本不会退出。它挂在后台,因为我仍然有 COM 引用,我什至可以使用它来打开另一个工作簿并使应用程序再次可见 - 只是,它在那个时间点已经卸载了加载项。但这就是为什么我没有注意到用户退出应用程序的原因:COM 引用仍然有效...
-
悬赏谁为这两个问题中的任何一个提供了有效且可靠的解决方案。
标签: c# excel com interop excel-2007