C#COM DLL阻止VBA应用程序退出

时间:2012-01-18 03:43:23

标签: c# multithreading vba com

我创建了一个C#COM DLL,它本质上是一个增强的进度条,在新线程上运行System.Windows.Forms.Application.Run()以显示带有对话框的表单。要在使用VBA的第三方应用程序中使用它,请执行以下操作:

Set pg = CreateObject("MyNS.MyProgressBar")
pg.ShowBar()
.
.
pg.Progress = 0.5
.
.
pg.ShutDownBar()

问题是用户能够在到达pg.ShutDownBar()之前关闭应用程序(使用File-> Quit或类似)。如果用户这样做,则永远不会调用pg.ShutDownBar(),结果是虽然隐藏了应用程序的窗口,但它仍然出现在任务管理器进程中。

所以我的问题是: 有没有办法检测父应用程序是否已关闭,然后中止c#中进度条的线程?

我在启动对话线程的主线程上尝试了System.Windows.Forms.Application.ThreadExit和System.Windows.Forms.ApplicationExit,但是当通过COM访问对象时,这些事件似乎不会被引发(尽管它们在.NET中创建对象时调用....)

有人可以提供一些建议吗?

1 个答案:

答案 0 :(得分:0)

这是COM引用计数工作方式的问题。除非调用COM包装程序的程序释放引用(因为M.Babcock建议要求程序进入“set pg = Nothing”的步骤),否则进度条将无法正常关闭。

我能做的唯一建议是设置“超时”属性(默认为30秒)。然后在进度条中使用后台线程,它检查最后一次调用“pg.Progess”的时间,以及它是否为>超时值,关机。这假设您可以期望大多数VB脚本至少每X秒报告一次进度(其中X是超时值)。