代码之家  ›  专栏  ›  技术社区  ›  Dan Is Fiddling By Firelight Leniency

当ActiveX(COM)控件被其父控件关闭时,清除它的正确方法是什么?

  •  2
  • Dan Is Fiddling By Firelight Leniency  · 技术社区  · 15 年前

    我的.NET控件在包装为ActiveX使用时出现问题,无法正确清理。

    默认行为使sdk的测试容器应用程序(tstcon32.exe)在我尝试关闭它时作为一个不诚实的进程运行。

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

    应用程序是mdi,当包含控件的页关闭时,将发送wm_destroy,此时 环境出口(0) 呼叫正在吹走整个应用程序。我试过了 Application.Exit() 作为替代方案,但这使得tstcon32仍在无形中运行。

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
    
        // WM_DESTROY
        if (m.Msg == 2)
            Environment.Exit(0);
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   hurst    9 年前

    通常,ActiveX容器在关闭之前会调用ioleobject::close和ioleobject::setclientsite(null)。system.windows.forms.control有自己的ioleobject实现。我认为你不能在派生类中重写它。

    通过应用程序发送WMY::EXIT不是MDI的选项,因为它将关闭整个程序而不是托管ActiveX的页面。如果容器正在泄漏接口指针,您就无能为力了。

    system.windows.forms.control的ioleobject实现调用control.dispose,前提是容器实现了ihtmldocument2。但我不认为您可以依赖容器来实现这个接口。

    推荐文章