Не могли бы вы создать 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