3

我的 .net 控件在打包以供 activeX 使用时没有得到正确清理时遇到问题。

默认行为使 SDK 的测试容器应用程序 (TstCon32.exe) 在我尝试关闭它时作为无 GUI 进程运行。

我最初通过谷歌找到的解决方法是覆盖 WndProc 并Environment.Exit(0)手动调用。这确实让 TstCon32.exe 完全关闭;但是它破坏了我需要托管控件的应用程序。

该应用程序是 MDI 并且当包含控件的页面关闭时正在发送 WM_DESTROY,此时Environment.Exit(0)调用正在吹走整个应用程序。我已经尝试过Application.Exit()作为替代方案,但这使得 TstCon32 仍然不可见地运行。

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // WM_DESTROY
    if (m.Msg == 2)
        Environment.Exit(0);
}
4

1 回答 1

2

通常,ActiveX 容器会在关闭之前调用 IOleObject::Close 和 IOleObject::SetClientSite(null)。System.Windows.Forms.Control 有自己的 IOleObject 实现。我认为您不能在派生类中覆盖它。

通过 Application::Exit 发送 WM_QUIT 不是 MDI 的选项,因为它将关闭整个程序而不是托管 ActiveX 的页面。如果容器泄漏了接口指针,那么您无能为力。

System.Windows.Forms.Control 的 IOleObject 实现仅在容器实现 IHTMLDocument2 时才调用 Control.Dispose。但我不认为你可以指望容器来实现这个接口。

于 2010-08-02T21:28:19.303 回答