如何从.NET Interop-ed UserControl关闭VB6父窗体?

时间:2013-06-13 19:38:35

标签: vb.net vb6 com-interop

我正在构建一个已经部署的VB6可执行文件的“插件”。我正在使用.NET和COM-Interop。 VB6创建一个空白表单,然后将我的.NET UserControl加载到它(但是现在.dll已被编译成一个可由VB6看到的.ocx ActiveX UserControl)。

我已经运行良好,但我希望能够从我的.NET代码中关闭VB6父窗体。我能够将VB6代码添加到我的VB6-ifyed UserControl中,但我似乎无法找到在UserControl被销毁时触发的事件。

到目前为止我尝试过:

  • 从我的.NET控件的Disposing事件中调用ParentForm.Close。收到错误Object Reference not set to Instance of an Object.
  • 尝试从VB6关闭(我可以从那里获得父表单的句柄)。使用ControlRemovedTerminated以及其他一些在回想起时毫无意义的破解性解决方法不会被触发。
  • 调用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并不十分熟悉。

1 个答案:

答案 0 :(得分:1)

好吧,我想出来并将发布我为后代所做的事情: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容器表单。它现在正确关闭表单!

回想起来它很有意义,但我不知道你可以轻易地在托管/非托管之间来回传递事件。