如何在不终止主应用程序的情况下卸载ActiveX的ocx以允许覆盖ocx?

时间:2013-09-19 09:16:19

标签: c++ mfc vb6 activex vc6

我在ActiveX中实施了VB6个控件,并在MFC42个应用程序中实例化。

我在应用程序的左侧面板上有一个树形视图结构,当选择了树中的不同项目时,在右侧面板上相应地加载了不同的ActiveX以显示所选项目的详细信息。

每当我想修改VB的{​​{1}}代码时,我都需要重启应用程序。这极大地中断了开发流程,因为应用程序启动非常缓慢。

在某些ActiveX中,我们有虚拟代码/数据,允许ActiveX在Internet Explorer中执行,加载速度更快,但并非所有ActiveX都拥有它。

我希望当我在树视图中单击不同的项目时,先前的ActiveX将被卸载,我可以使用新版本覆盖它。

如果从未实例化/显示ActiveX,我可以在应用程序仍在运行时替换ActiveX

我在互联网上搜索并在ocx上找到two articles,他们都建议正确的清理方法是:

ActiveX

我们已经使用此方法销毁了m_pControl = new CWnd; m_pControl->CreateControl(strControlProgid, "", WS_VISIBLE, rc, this, 5000, NULL, FALSE, NULL); // ... m_pControl->DestroyWindow(); delete m_pControl; ,但我仍然需要退出应用程序才能覆盖ActiveX

修改
或者,对于VC ++ 6(使用MFC42),而不是Noseratiohis answer提到的ocx;我可以使用CoFreeUnusedLibrariesEx,它可以毫不拖延地用于单线程分区(STA)。

1 个答案:

答案 0 :(得分:1)

如果COM引用计数在您的应用程序中正常工作,您可以尝试强制使用CoFreeUnusedLibrariesEx卸载不再使用的ActiveX DLL。