Самый простой способ отправки сообщений между программами Matlab, VB6 и VB.NET - PullRequest
0 голосов
/ 16 мая 2009

Мы модернизируем набор процедур сбора и анализа данных из программ 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 для реализации каналов (или чего-то подобного) между программами. Мы хотели бы воссоздать элегантно простой синтаксис MBXterProcess ActiveX и получить фрагмент кода, который прослушивает сообщение с именем Windows верхнего уровня этой программы, а затем вызывает конкретный m-файл Matlab или функцию VB.NET с строковые данные (например, имя файла) в качестве аргумента.

Ответы [ 2 ]

1 голос
/ 16 мая 2009

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

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

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

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

'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, запустите несколько копий. Заполните поля назначения и текстовые поля сообщений и нажмите кнопку - вы увидите, что сообщения получены в всех 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, который инструктирует его удалить объект мессенджера из его коллекции,

0 голосов
/ 16 мая 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...