2009-05-16 5 views
0

Nous améliorons une suite de programmes d'acquisition et d'analyse des données des programmes de VB6 à un mélange de VB.NET, VB6 et programmes Matlab. Nous voulons garder le système modulaire (EXEs séparés) afin que nous puissions facilement créer des programmes d'analyse autonomes spécialisés sans devoir constamment mettre à jour une application massive. Nous avons utilisé MBInterProcess pour envoyer des messages entre EXEs lorsque tous les programmes ont été écrits en VB6 et cela a fonctionné parfaitement pour nous (par exemple, pour que l'EXE d'acquisition de données envoie le dernier nom de fichier à un programme d'affichage de données autonome). Malheureusement, cet ActiveX ne peut pas être utilisé dans Matlab ou VB.NET pour recevoir des messages. Nous nous demandons quel est le système de transmission de messages de chaînes le plus simple (pipes, messages enregistrés, etc.) que nous pourrions adopter. Pour le moment, nous ne faisons qu'interroger si un nouveau fichier a été écrit dans un dossier spécifique, ce qui ne peut pas être la meilleure solution. Notre solution idéale ne nécessiterait pas un énorme investissement dans le temps d'apprentissage des nuances de Windows (nous sommes des biologistes, pas des programmeurs à plein temps) et fonctionnerait à la fois dans les versions WinXP et 64 bits de Windows.d'envoyer Simplest messages entre Matlab, VB6 et VB.NET programmes

En réponse aux requêtes, nous avons enveloppé toute la session Matlab dans un programme VB6 qui a le contrôle ActiveX MBInterProcess. Cela fonctionne mais n'est pas une excellente solution pour nous car il nous verrouillera probablement dans WinXP pour toujours (et nous empêchera certainement d'utiliser la version 64 bits de Matlab). La dernière version de Matlab (2009a) peut accéder directement aux fonctions .NET, donc nous supposons qu'une solution pourrait être d'utiliser la bibliothèque .NET pour implémenter des pipes (ou quelque chose de similaire) entre les programmes. Nous souhaitons recréer la syntaxe simple et élégante de MBInterProcess ActiveX et avoir un morceau de code qui écoute un message avec le nom Windows de niveau supérieur de ce programme, puis appeler un fichier m Matlab spécifique, ou une fonction VB.NET, avec les données de chaîne (par exemple, nom de fichier) en tant qu'argument.

Répondre

0

Je l'ai utilisé Matlab dos commande pour exécuter un programme Java sur la ligne de commande, il attend la ligne de commande pour terminer avant de rendre le contrôle à Matlab. Cela a bien fonctionné pour moi, après que mon programme Matlab ait repris le contrôle, j'ai lu le fichier de sortie du Java. J'ai utilisé des programmes Matlab compilés (c'est-à-dire exe), ils fonctionnent bien mais ils pulvérisent des fichiers quand ils s'exécutent - Je crois qu'il est possible de passer des arguments en ligne de commande à un exécutable compilé. En supposant que VB.NET soit comme C# .NET, vous pouvez exécuter votre exe à partir du code en utilisant quelque chose comme l'objet Process.

Sinon il existe des moyens de compiler pour .dll qui sont accessibles via .NET voir ici:

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

pour une explication. Je n'ai jamais essayé cela ...

+0

Ressemble aux suggestions DDE et COM dans l'article que vous avez lié fonctionnerait également avec VB6. – MarkJ

+0

C'est ma compréhension - je dois admettre que je me suis tenu à l'écart de telles choses de peur de se cogner la tête contre les mystérieuses incantations du compilateur. –

1

Pourriez-vous créer un EXE ActiveX en VB6 pour simplement transférer des messages entre les différentes parties? Quand quelqu'un l'appelait, il soulevait un événement avec les paramètres passés à l'appel. Votre code VB6 et VB.NET pourrait établir une référence à l'exe ActiveX pour l'appeler et couler ses événements. Je ne connais pas Matlab, donc je ne sais pas si ce serait accessible là-bas.

EDIT: vous avez écrit que Matlab 2009a peut accéder directement à .NET. S'il peut absorber des événements .NET, vous pouvez également avoir un wrapper .NET sur l'EXE ActiveX VB6.

Voici un exemple de code que j'ai frappé rapidement.

Projet VB6 ActiveX EXE avec le nom de projet VB6MatlabMessenger. Chaque message a une chaîne de texte Destination (qui identifie en quelque sorte le destinataire prévu) et une chaîne avec le message.

'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 

Et un VB6 test exe normale, avec une référence à la VB6MatlabMessenger. Voici l'ensemble du fichier frm. Construisez cela comme un exe, exécutez quelques copies. Remplissez les champs de texte de destination et de message et cliquez sur le bouton - vous verrez que les messages sont reçus en tous les les exes (reportés dans les listboxes).

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 

J'ai commencé à écrire une bibliothèque de classes VB.NET qui enveloppe le VB6 pour le rendre accessible à .NET. Je n'ai pas testé celui-ci. Il a une référence à la 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 

Cela peut vous aider à démarrer. Notez que les objets de messager VB6 vivront pour toujours parce que le messager garde une référence à eux en interne, donc COM ne les rangera jamais. Si cela devient un problème (si beaucoup de messages sont envoyés sans redémarrer le PC) vous pouvez ajouter une méthode au messager VB6 qui lui demande de retirer l'objet messager de sa collection,

Questions connexes