3

既に展開されている VB6 実行可能ファイルの一種の「プラグイン」を構築しています。COM-Interop と共に .NET を使用しています。VB6 は空白のフォームを作成し、そこに .NET UserControl をロードします (ただし、.dll は VB6 で表示できる .ocx ActiveX UserControl にコンパイルされています)。

うまく機能していますが、.NET コード内から VB6 親フォームを閉じられるようにしたいと考えています。VB6 化された UserControl に VB6 コードを追加することはできますが、UserControl が破棄されたときに発生するイベントが見つからないようです。

私がこれまでに試したこと:

  • ParentForm.Close.NET コントロールの Disposing イベントからの呼び出し。受信エラーObject Reference not set to Instance of an Object.
  • VB6 から閉じようとしています (そこから親フォームのハンドルを取得できます)。ControlRemoved、 、および振り返ってみるとまったく意味のない他のいくつかのハック的な回避策を使用しTerminatedても、トリガーされません。
  • 呼び出すApplication.Exitと(この時点で本当に必死になっています)、アプリケーション全体が閉じます(誰がサンクするでしょうか...)

.NET コントロールに配置した VB6 Interop コードを調べたところ、次のように有望に見えます。

#Region "VB6 Events"

'This section shows some examples of exposing a UserControl's events to VB6.  Typically, you just
'1) Declare the event as you want it to be shown in VB6
'2) Raise the event in the appropriate UserControl event.

Public Shadows Event Click() 'Event must be marked as Shadows since .NET UserControls have the same name.
Public Event DblClick()

Private Sub InteropUserControl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
    RaiseEvent Click()
End Sub

Private Sub InteropUserControl_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
    RaiseEvent DblClick()
End Sub

#End Region

このセクションにイベントを追加するだけですか?私は Interop や VB6 についてあまり詳しくありません。

4

1 に答える 1

2

わかりました、私はそれを理解し、将来の世代のために私がしたことを投稿します:P

私は VB6 コードのイベント ハンドラーで正しかったし、MarkJ も正しかった。

.NET コードでイベントを作成しました。

Public Event KillApp()

そして、すべてを閉じたいときは、それを上げました:

RaiseEvent KillApp()

VB6 UserControl コードでは、イベントを再度宣言しました。

Public Event KillApp()

次に、そのハンドラーを追加しました。

Private Sub MenuCtl_KillApp()
    Unload Me.ParentForm
End Sub

MenuCtl.NET コントロールのインスタンスで、 はコントロールをMe.ParentForm格納する VB6 コンテナー フォームです。フォームを正しく閉じるようになりました。

振り返ってみると、それは非常に理にかなっていますが、管理対象と管理対象外の間でイベントを簡単にやり取りできることを知りませんでした。

于 2013-06-14T15:43:23.073 に答える