5

COM オブジェクト (COM 公開 C# オブジェクト) を使用している vb6 アプリがあります。vb6 アプリは、COM (C#) オブジェクトによって発行されたイベントをサブスクライブしています。

私の問題は、そのイベントをプログラムで登録解除する方法がわからないことです。サブスクライブを解除する唯一の方法は、最初からサブスクライブしないことです (つまり、vb6 コードのイベント ハンドラーをコメント アウトします)。

実行時に(プログラムで)サブスクライブを解除する方法はありますか?おそらく、vb6 イベント ハンドラーに対応するデリゲートを識別し、それを呼び出さないことによって、C# 側で何かを行うことでしょうか?

前もって感謝します。

4

2 に答える 2

2

より詳細な制御を可能にするもう1つのオプションは、コールバックインターフェイスです。

EventXYZ単一のメソッドを持つ.NETライブラリのインターフェイスを公開します。VB6クラス(およびその他のリスナー)は、このインターフェイスを実装し、オブジェクトへの参照を.NETクラスに渡して、メソッドを起動させることができます。

これは、COMおよび.NETイベントがinternallを使用するのと本質的に同じ方法ですが、.NETはイベントレベルまでより細かくなります。

于 2012-09-03T13:10:52.577 に答える
2

VB6 でイベントの受信を停止するには、2 つのオブジェクト参照変数 (WithEventsキーワードを含むものと含まないもの) を保持します。購読する場合は、最初のオブジェクトを 2 番目と同じオブジェクトに設定し、購読を解除する場合は最初のオブジェクトを に設定しNothingます。オブジェクトを解放したいときは、両方を解放/交換する必要があります。

Dim MyObject As MyClass
Dim WithEvents MyObjectEvents As MyClass

Public Sub MyObjectEvents_EventName()
  MsgBox "Received event"
End Sub

Private Sub Subscribe()
  Set MyObjectEvents = MyObject
End Sub

Private Sub Unsubscribe()
  Set MyObjectEvents = Nothing
End Sub
于 2012-09-03T12:43:39.970 に答える