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

.net 当activeX(COM)控件被其父控件关闭时,清除它的正确方法是什么?,.net,com,activex,resource-cleanup,tstcon32,.net,Com,Activex,Resource Cleanup,Tstcon32,当包装为activeX使用时,我的.net控件没有得到正确的清理 当我尝试关闭SDK的测试容器应用程序(TstCon32.exe)时,默认行为会使其作为一个简单的进程运行 我最初通过谷歌找到的解决方法是覆盖WndProc并手动调用Environment.Exit(0)。这确实使TstCon32.exe完全关闭;但是它破坏了我需要托管控件的应用程序 应用程序是MDI,当包含控件的页面关闭时,会发送WM_DESTROY,此时环境。退出(0)调用会吹走整个应用程序。我尝试了Application.Ex

当包装为activeX使用时,我的.net控件没有得到正确的清理

当我尝试关闭SDK的测试容器应用程序(TstCon32.exe)时,默认行为会使其作为一个简单的进程运行

我最初通过谷歌找到的解决方法是覆盖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);
}

通常,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。但我认为您不能指望容器来实现此接口。

谢谢。我将研究您提到的OLE方法。我为之编写的主机应用程序属于第三方,因此我无法修改它;似乎TstCon32和我的目标应用程序都没有调用这两个方法,因为没有显示MessageBox。如何调用?Windows窗体控件类的IOleObject实现在外部不可见。在MyActiveXControl.cs中,我添加了IOleObject接口,并实现了如下方法:public void SetClientSite(IOleClientSite pClientSite){MessageBox.Show(“SetClientSite方法,pClientSite=“+pClientSite”);}你可能对我正在编写的代码感到困惑吗?我正在编写activeX控件。不是使用它的应用程序。我有一个类似的问题。“你找到解决办法了吗?”迈克尔·斯托尔我想我没有找到