.net 当activeX(COM)控件被其父控件关闭时,清除它的正确方法是什么?
当包装为activeX使用时,我的.net控件没有得到正确的清理 当我尝试关闭SDK的测试容器应用程序(TstCon32.exe)时,默认行为会使其作为一个简单的进程运行 我最初通过谷歌找到的解决方法是覆盖WndProc并手动调用.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
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控件。不是使用它的应用程序。我有一个类似的问题。“你找到解决办法了吗?”迈克尔·斯托尔我想我没有找到