0

VB6 プログラムから VB.NET、VB6、および Matlab プログラムの混合物への一連のデータ取得および分析ルーチンをアップグレードしています。システムをモジュラー (個別の EXE) に保ちたいので、1 つの大規模なアプリケーションを常にアップグレードする必要なく、専用のスタンドアロン分析プログラムを簡単に作成できます。すべてのプログラムが VB6 で記述されている場合、MBInterProcess を使用して EXE 間でメッセージを送信しました。残念ながら、この ActiveX を Matlab または VB.NET 内で使用してメッセージを受信することはできません。採用できる最も単純な文字列メッセージ パッシング システム (パイプ、登録メッセージなど) は何かを考えています。現在、新しいファイルが特定のフォルダーに書き込まれたかどうかを確認するためにポーリングしています。これは最善の解決策とは言えません。私たちの理想的なソリューションは、Windows のニュアンスを学習するために多大な時間を費やす必要がなく (私たちは生物学者であり、フルタイムのプログラマーではありません)、WinXP と 64 ビット バージョンの Windows の両方で動作します。

クエリに応答して、MBInterProcess ActiveX コントロールを持つ VB6 プログラム内に Matlab セッション全体をラップしました。それはうまくいきますが、私たちにとっては素晴らしい解決策ではありません。なぜなら、それは私たちを永遠に WinXP に縛り付けてしまうからです (もちろん、Matlab の 64 ビット バージョンを使用できなくなるでしょう)。最新バージョンの Matlab (2009a) は .NET 関数に直接アクセスできるため、.NET ライブラリを使用してプログラム間でパイプ (または類似のもの) を実装することが 1 つの解決策であると想定しています。MBInterProcess ActiveX の洗練された単純な構文を再作成し、そのプログラムの最上位の Windows 名を使用してメッセージをリッスンし、特定の Matlab m ファイルまたは VB.NET 関数を呼び出すコードを用意します。引数として文字列データ (ファイル名など)。

4

2 に答える 2

1

VB6 で ActiveX EXE を作成して、さまざまな関係者間でメッセージを簡単に転送できますか? 誰かがそれを呼び出すと、呼び出しに渡されたパラメーターでイベントが発生します。VB6 および VB.NET コードは、ActiveX exe への参照を確立して、それを呼び出し、そのイベントをシンクできます。私は Matlab に詳しくないので、そこでアクセスできるかどうかはわかりません。

編集: Matlab 2009a は .NET に直接アクセスできると書いています。.NET イベントをシンクできる場合は、VB6 ActiveX EXE で .NET ラッパーを使用することもできます。

これが私がすぐに思いついたサンプルコードです。

プロジェクト名が VB6MatlabMessenger の VB6 ActiveX EXE プロジェクト。各メッセージには、テキスト文字列 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

そして、VB6MatlabMessenger への参照を含む、テスト VB6 通常の exe。これがfrmファイル全体です。これを exe としてビルドし、いくつかのコピーを実行します。送信先とメッセージのテキスト フィールドに入力し、ボタンをクリックします。メッセージがすべての exe で受信されていることがわかります (リストボックスに報告されます)。

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

VB6 をラップして .NET からアクセスできるようにする VB.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 はそれらを整理しません。これが問題になる場合 ( PC を再起動せずに多くのメッセージが送信される場合)、コレクションからメッセンジャー オブジェクトを削除するように指示するメソッドを VB6 メッセンジャーに追加できます。

于 2009-05-16T15:24:10.097 に答える
0

Matlab dos コマンドを使用して、コマンドラインで Java プログラムを実行しました。コマンドラインが完了するのを待ってから、制御を Matlab に返します。私のMatlabプログラムが制御を取り戻した後、Javaから出力ファイルを読みました。

私はコンパイル済みの Matlab プログラム (つまり、exe) を使用しました。これらは正常に動作しますが、実行時にファイルをばら撒きます。コンパイル済みの実行可能ファイルにコマンドライン引数を渡すことは可能だと思います。VB.NET が C# .NET に似ていると仮定すると、Process オブジェクトなどを使用してコードから exe を実行できます。

または、.NET 経由でアクセスできる .dll にコンパイルする方法があります。こちらを参照してください。

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

説明のために。私はこれを試したことがない...

于 2009-05-16T15:03:40.740 に答える