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

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

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

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

C# – 通过将标志设置为另一个状态来终止项目

有任何想法吗?

这是一个非常标准的方案,用于VB6客户端和VB6服务器的异步后台处理。 (例如,它出现在Dan Appleman的书和微软的VB6样本中 。)我认为它也适用于C#客户端。

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

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

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

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

我不会在进程边界之间保持引用打开,但是你可以通过缓存来恢复进程的long hWnd并从.Net内部调用kill。