Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab、VB6和VB.NET程序之间发送消息的最简单方法_Vb.net_Vb6_Matlab_Messages_Interprocess - Fatal编程技术网

在Matlab、VB6和VB.NET程序之间发送消息的最简单方法

在Matlab、VB6和VB.NET程序之间发送消息的最简单方法,vb.net,vb6,matlab,messages,interprocess,Vb.net,Vb6,Matlab,Messages,Interprocess,我们正在将一套数据采集和分析例程从VB6程序升级为VB.NET、VB6和Matlab程序的混合。我们希望保持系统模块化(单独的EXE),这样我们就可以轻松创建专门的独立分析程序,而无需不断升级一个大型应用程序。当所有程序都用VB6编写时,我们使用MBInterProcess在EXE之间发送消息,这对我们来说非常有效(例如,让数据采集EXE将最新文件名发送到独立的数据显示程序)。不幸的是,此ActiveX无法在Matlab或VB.NET中用于接收消息。我们想知道我们可以采用的最简单的字符串消息传递

我们正在将一套数据采集和分析例程从VB6程序升级为VB.NET、VB6和Matlab程序的混合。我们希望保持系统模块化(单独的EXE),这样我们就可以轻松创建专门的独立分析程序,而无需不断升级一个大型应用程序。当所有程序都用VB6编写时,我们使用MBInterProcess在EXE之间发送消息,这对我们来说非常有效(例如,让数据采集EXE将最新文件名发送到独立的数据显示程序)。不幸的是,此ActiveX无法在Matlab或VB.NET中用于接收消息。我们想知道我们可以采用的最简单的字符串消息传递系统(管道、注册消息等)是什么。现在我们只是轮询,看看新文件是否写入了特定的文件夹,这不是最好的解决方案。我们的理想解决方案不需要花费大量时间学习Windows的细微差别(我们是生物学家,不是全职程序员),并且可以在WinXP和64位版本的Windows中工作


为了响应这些查询,我们将整个Matlab会话包装在一个VB6程序中,该程序具有MBInterProcess ActiveX控件。这是可行的,但对我们来说不是一个很好的解决方案,因为它可能会将我们永远锁定在WinXP中(并且肯定会阻止我们使用64位版本的Matlab)。最新版本的Matlab(2009a)可以直接访问.NET函数,因此我们假设一种解决方案可能是使用.NET库跨程序实现管道(或类似的东西)。我们希望重新创建MBInterProcess ActiveX优雅简单的语法,并使用一段代码侦听具有该程序顶级Windows名称的消息,然后使用字符串数据(例如,文件名)调用特定的Matlab m文件或VB.NET函数作为参数。

我使用Matlab dos命令在命令行上执行Java程序,它等待命令行完成,然后将控制返回Matlab。这对我来说效果很好,在我的Matlab程序恢复控制后,我从Java读取了输出文件

我使用过编译过的Matlab程序(即exe),这些程序可以正常工作,但它们在执行时会向周围喷洒文件——我相信可以将命令行参数传递给编译过的可执行文件。假设VB.NET类似于C#.NET,则可以使用类似Process对象的东西从代码中执行exe

或者,也有编译为.dll的方法,可通过.NET访问。请参见此处:


我需要一个解释。我从未尝试过这个…

您能在VB6中创建一个ActiveX EXE,以便在不同方之间转发消息吗?当有人调用它时,它将引发一个事件,其中包含传递给调用的参数。VB6和VB.NET代码可以建立对ActiveX exe的引用,以调用它并接收其事件。我不熟悉Matlab,所以我不知道它在那里是否可用

编辑:您已经编写了Matlab2009a可以直接访问.NET。如果它可以接收.NET事件,您还可以在VB6 ActiveX EXE上使用.NET包装器

下面是一些我很快找到的示例代码

项目名为VB6MatlabMessenger的VB6 ActiveX EXE项目。每封邮件都有一个文本字符串目的地(以某种方式标识目标收件人)和一个包含邮件的字符串

'MultiUse class VB6Messenger
Option Explicit

Public Event MessageReceived(ByVal Destination As String, ByVal Message As String)

Public Sub SendMessage(ByVal Destination As String, ByVal Message As String)
  Call Manager.RaiseEvents(Destination, Message)
End Sub

Private Sub Class_Initialize()
  Call Manager.AddMessenger(Me)
End Sub

Friend Sub RaiseTheEvent(ByVal Destination As String, ByVal Message As String)
  RaiseEvent MessageReceived(Destination, Message)
End Sub

'BAS module called Manager
Option Explicit

Private colMessengers As New Collection

Sub AddMessenger(obj As VB6Messenger)
  colMessengers.Add obj
End Sub

Sub RaiseEvents(ByVal Destination As String, ByVal Message As String)
  Dim obj As VB6Messenger
  For Each obj In colMessengers
    Call obj.RaiseTheEvent(Destination, Message)
  Next obj
End Sub
和一个测试VB6普通exe,带有对VB6MatlabMessenger的引用。这是整个frm文件。将其构建为exe,运行几个副本。填写destination(目的地)和message(消息)文本字段并单击按钮-您将看到消息在allEXE(列表框中报告)中收到

我开始编写一个VB.NET类库,该类库包装VB6以使.NET能够访问它。我还没有测试过这个。它引用了VB6MatLabMessenger

Public Class VBNETMatlabMessenger
  Private WithEvents objVB6Messenger As VB6MatlabMessenger.VB6Messenger

  Public Event MessageReceived(ByVal Destination As String, ByVal Message As String)

  Public Sub SendMessage(ByVal Destination As String, ByVal Message As String)
    objVB6Messenger.SendMessage(Destination, Message)
  End Sub

  Public Sub New()
    objVB6Messenger = New VB6MatlabMessenger.VB6Messenger
  End Sub

  Private Sub objVB6Messenger_MessageReceived(ByVal Destination As String, ByVal Message As String) Handles objVB6Messenger.MessageReceived
    RaiseEvent MessageReceived(Destination, Message)
  End Sub
End Class

这可能会让你开始。请注意,VB6 messenger对象将永远存在,因为messenger在内部保留对它们的引用,所以COM永远不会整理它们。如果出现问题(如果许多消息在未重新启动电脑的情况下发送),您可以向VB6 messenger添加一个方法,指示它从其集合中删除messenger对象,

看起来您链接的文章中的DDE和COM建议也适用于VB6。这是我的理解-我必须承认,我已经避开了这些东西,因为我害怕与神秘的编译器咒语发生冲突。
Public Class VBNETMatlabMessenger
  Private WithEvents objVB6Messenger As VB6MatlabMessenger.VB6Messenger

  Public Event MessageReceived(ByVal Destination As String, ByVal Message As String)

  Public Sub SendMessage(ByVal Destination As String, ByVal Message As String)
    objVB6Messenger.SendMessage(Destination, Message)
  End Sub

  Public Sub New()
    objVB6Messenger = New VB6MatlabMessenger.VB6Messenger
  End Sub

  Private Sub objVB6Messenger_MessageReceived(ByVal Destination As String, ByVal Message As String) Handles objVB6Messenger.MessageReceived
    RaiseEvent MessageReceived(Destination, Message)
  End Sub
End Class