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

Ste*_*eve 0 c# vb6 interop

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

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

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

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

有任何想法吗?

Mar*_*rkJ 8

这是一个非常标准的方案,用于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时提前返回.

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

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

  • +1.到目前为止,这是在VB6中免费获得多线程并且运行良好的最简单方法,而且它不会破坏程序或IDE的稳定性,就像尝试直接从VB6代码执行Win32线程一样. (2认同)