我遇到的问题是,我的 .net 控件在包装以供 ActiveX 使用时无法正确清理。
当我尝试关闭 SDK 的测试容器应用程序 (TstCon32.exe) 时,默认行为会使它作为无 GUI 进程运行。
我最初通过谷歌找到的解决方法是覆盖 WndProc 并调用Environment.Exit(0)
手动。这确实使 TstCon32.exe 完全关闭;然而,它破坏了我需要托管控件的应用程序。
该应用程序是 MDI 和WM_DESTROY
当包含该控件的页面关闭时发送,此时Environment.Exit(0)
通话震撼了整个应用程序。我试过了Application.Exit()
作为替代方案,但这会使 TstCon32.exe 仍然以不可见的方式运行。
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 的页面。如果容器泄漏接口指针,您无能为力。
仅当容器实现 IHTMLDocument2 时,System.Windows.Forms.Control 的 IOleObject 实现才会调用 Control.Dispose。但我不认为你可以指望容器来实现这个接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)