为vb6应用程序制作C#kill事件?

时间:2009-04-07 20:10:16

标签: c# vb6 interop

我有一个处理很长时间的VB6应用程序。直接杀死它是不可行的,所以我想在VB6应用程序中设置某种标志。如果在我的C#应用​​程序中我决定将其关闭,我想切换此标志以让VB6应用程序知道已请求关闭。现在,我还需要一些命名的东西,因为将有几个VB6应用程序作为activex exes旋转。有谁知道如何实现这样的东西?工作流程如下所示

C#app - 在单独的线程中旋转多个VB6 activex.exes,用某些东西初始化应用程序(以下称为标志)我可以在C#中更改,并调用DoStuff命令,这需要很长时间才能返回。 / p>

VB6 - 获取带有标志的initialize命令。 DoStuff被调用。在DoStuff循环中,它检查标志是否仍然设置。

C# - 通过将标志设置为另一个状态来杀死项目

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

这是使用VB6客户端和VB6服务器进行异步后台处理的一个非常标准的方案。 (例如,它位于Dan Appleman的book和Microsoft的VB6 samples。)我认为它也适用于C#客户端。

  • VB6 ActiveX EXE对象应该公开事件CheckQuitDoStuff()。这需要一个名为Quit的ByRef布尔值。
  • 客户端在ActiveX EXE对象中调用StartDoStuff。此例程在隐藏表单上启动Timer,立即返回。这将解锁调用线程。定时器间隔非常短,因此Timer事件会快速触发。
  • Timer事件处理程序禁用Timer,然后回调到ActiveX对象DoStuff方法。这开始了漫长的处理。
  • DoStuff方法会定期引发CheckQuitDoStuff事件。客户端的事件处理程序检查特殊标志,如果需要中止,则设置Quit True。然后DoStuff中止计算并在Quit为True时提前返回。

此方案意味着客户端实际上不需要是多线程的,因为调用线程在“DoStuff”发生时不会阻塞。棘手的部分是确保DoStuff以适当的间隔引发事件 - 太长时间,并且当你想要的时候你不能退出:太短,并且你正在放慢DoStuff的速度。此外,当DoStuff退出时,它必须卸载隐藏的表单。

如果DoStuff确实设法在中止之前完成所有工作,您可以引发一个不同的事件来告诉客户端该工作已完成。

答案 1 :(得分:1)

创建ActiveX对象时,保留存储在应用程序或线程中的引用。 COM将处理跨线程的编组。有了参考资料,您可以调用它上面的方法并将其杀死。如果在线程中保留引用,则需要使用.NET的进程间消息传递机制将其传递给要在ActiveX EXE上设置kill标志的.NET线程。

答案 2 :(得分:0)

我不会在进程边界之间保持引用打开,但是你当然可以缓存进程的Long hAnd并从.Net内部调用kill。