C#COM DLL阻止VBA应用程序退出
本文关键字:应用程序 退出 VBA 阻止 DLL C#COM | 更新日期: 2023-09-27 18:20:31
我创建了一个C#COM DLL,它本质上是一个增强的进度条,在一个新线程上运行System.Windows.Forms.Application.Run()以显示带有对话框的表单。要在使用VBA的第三方应用程序中使用它,您可以执行以下操作:
Set pg = CreateObject("MyNS.MyProgressBar")
pg.ShowBar()
.
.
pg.Progress = 0.5
.
.
pg.ShutDownBar()
问题是,用户可以在到达第ShutDownBar()页之前关闭应用程序(使用File->Quit或类似方法)。如果用户这样做,则永远不会调用pg.ShutDownBar(),结果是尽管应用程序的窗口是隐藏的,但它仍然出现在任务管理器进程中。
所以我的问题是:是否有某种方法可以检测父应用程序是否已关闭,然后中止c#中进度条的线程?
我已在启动对话框线程的主线程上尝试过System.Windows.Forms.Application.ThreadExit和System.Windows.Fforms.ApplicationExit,但通过COM访问对象时似乎不会引发这些事件(尽管在.NET中创建对象时会调用它们)…
有人能提供一些建议吗?
这是COM引用计数工作方式的问题。除非调用COM包装器的程序释放引用(正如M.Babcock所建议的那样,这将要求程序进入"set pg=Nothing"的步骤),否则进度条将无法正确关闭。
我唯一能提出的建议是设置一个"超时"属性(默认为30秒)。然后在进度条中使用一个后台线程,检查上一次调用"pg.Progess"的时间,如果超过超时值,则关闭。这是假设您可以期望大多数VB脚本至少每X秒报告一次进度(其中X是超时值)。