Самый простой способ отправлять сообщения между программами Matlab, VB6 и VB.NET

Мы обновляем набор процедур сбора и анализа данных из программ VB6 до смеси программ VB.NET, VB6 и Matlab. Мы хотим сохранить модульную систему (отдельные EXE-файлы), чтобы мы могли легко создавать специализированные автономные программы анализа без необходимости постоянно обновлять одно крупное приложение. Мы использовали MBInterProcess для отправки сообщений между EXE-файлами, когда все программы были написаны на VB6, и это отлично сработало для нас (например, чтобы EXE-файл для сбора данных отправлял последнее имя файла в автономную программу отображения данных). К сожалению, этот ActiveX нельзя использовать в Matlab или VB.NET для получения сообщений. Нам интересно, какова самая простая система передачи строковых сообщений (каналы, зарегистрированные сообщения и т. Д.), Которую мы могли бы принять. Прямо сейчас мы просто проводим опрос, чтобы узнать, был ли новый файл записан в определенную папку, что не может быть лучшим решением. Наше идеальное решение не потребовало бы огромных затрат времени на изучение нюансов Windows (мы биологи, а не штатные программисты) и работало бы как в WinXP, так и в 64-битных версиях Windows.

В ответ на запросы мы обернули весь сеанс Matlab в программу VB6, которая имеет элемент управления ActiveX MBInterProcess. Это работает, но не является для нас отличным решением, поскольку, вероятно, навсегда заблокирует нас в WinXP (и, безусловно, помешает нам использовать 64-битную версию Matlab). Последняя версия Matlab (2009a) может напрямую обращаться к функциям .NET, поэтому мы предполагаем, что одним из решений может быть использование библиотеки .NET для реализации каналов (или чего-то подобного) в программах. Мы хотели бы воссоздать элегантно простой синтаксис MBInterProcess ActiveX и иметь фрагмент кода, который прослушивает сообщение с именем верхнего уровня Windows этой программы, а затем вызывает определенный m-файл Matlab или функцию VB.NET с помощью строковые данные (например, имя файла) в качестве аргумента.


person Community    schedule 16.05.2009    source источник


Ответы (2)


Не могли бы вы создать ActiveX EXE в VB6, чтобы просто пересылать сообщения между разными сторонами? Когда кто-нибудь его вызывал, он инициировал событие с параметрами, переданными вызову. Ваш код VB6 и VB.NET может установить ссылку на ActiveX exe, чтобы вызывать его и принимать его события. Я не знаком с Matlab, поэтому не знаю, будет ли он там доступен.

РЕДАКТИРОВАТЬ: вы написали, что Matlab 2009a может напрямую обращаться к .NET. Если он может принимать события .NET, у вас также может быть .NET-оболочка для VB6 ActiveX EXE.

Вот пример кода, который я быстро придумал.

Проект VB6 ActiveX EXE с именем проекта VB6MatlabMessenger. Каждое сообщение имеет текстовую строку «Назначение» (которая каким-то образом идентифицирует предполагаемого получателя) и строку с сообщением.

'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 normal exe, со ссылкой на VB6MatlabMessenger. Вот и весь файл frm. Создайте его как exe, запустите несколько копий. Заполните поля назначения и текста сообщения и нажмите кнопку - вы увидите, что сообщения получены в всех exes (указанных в списках).

VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3090
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3090
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.ListBox lstEvents 
      Height          =   1620
      Left            =   120
      TabIndex        =   3
      Top             =   1320
      Width           =   4455
   End
   Begin VB.TextBox txtMessage 
      Height          =   375
      Left            =   120
      TabIndex        =   2
      Text            =   "Message"
      Top             =   840
      Width           =   2295
   End
   Begin VB.TextBox txtDestination 
      Height          =   375
      Left            =   120
      TabIndex        =   1
      Text            =   "Destination"
      Top             =   240
      Width           =   2295
   End
   Begin VB.CommandButton cmdSendMessage 
      Caption         =   "Send Message"
      Height          =   495
      Left            =   2640
      TabIndex        =   0
      Top             =   360
      Width           =   1575
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private WithEvents objMessenger As VB6MatlabMessenger.VB6Messenger

Private Sub cmdSendMessage_Click()
  objMessenger.SendMessage txtDestination, txtMessage.Text
End Sub

Private Sub Form_Load()
  Set objMessenger = New VB6MatlabMessenger.VB6Messenger
End Sub

Private Sub objMessenger_MessageReceived(ByVal Destination As String, ByVal Message As String)
  lstEvents.AddItem Now() & " RECEIVED - " & Destination & ", " & Message
End Sub

Я начал писать библиотеку классов 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 будут жить вечно, потому что мессенджер хранит на них внутреннюю ссылку, поэтому COM никогда не будет их приводить в порядок. Если это становится проблемой (если много сообщений отправляется без перезагрузки ПК), вы можете добавить метод к мессенджеру VB6, который инструктирует его удалить объект мессенджера из своей коллекции,

person MarkJ    schedule 16.05.2009

Я использовал команду Matlab dos для выполнения программы Java в командной строке, она ожидает завершения командной строки, прежде чем вернуть управление в Matlab. Это сработало для меня, после того, как моя программа Matlab восстановила контроль, я прочитал выходной файл с Java.

Я использовал скомпилированные программы Matlab (например, exe), они работают нормально, но они распыляют файлы, когда они выполняются - я считаю, что можно передать аргументы командной строки скомпилированному исполняемому файлу. Предполагая, что VB.NET похож на C # .NET, вы можете выполнить исполняемый файл из кода, используя что-то вроде объекта Process.

В качестве альтернативы есть способы компиляции в .dll, которые доступны через .NET, см. Здесь:

http://www.codeproject.com/KB/dotnet/matlabeng.aspx

для объяснения. Никогда не пробовал ...

person Ian Hopkinson    schedule 16.05.2009
comment
Похоже, предложения DDE и COM в статье, которую вы связали, также будут работать с VB6. - person MarkJ; 16.05.2009
comment
Это мое понимание - я должен признать, что я держался подальше от таких вещей, опасаясь удариться головой о таинственные заклинания компилятора. - person Ian Hopkinson; 16.05.2009