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

How to unload ActiveX's ocx without terminating main application to allow the ocx to be overwritten?

本文关键字:ocx 许覆盖 覆盖 卸载 终止 情况下 应用程序 ActiveX      更新时间:2023-10-16

我有ActiveX控件在VB6中实现,并在MFC42应用程序中实例化。

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

每当我想修改ActiveXVB代码时,我都需要重新启动应用程序。这极大地中断了开发流程,因为应用程序启动速度非常慢。

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

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

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

我在网上搜索了两篇关于ActiveX的文章,它们都建议正确的清理方法是:

m_pControl = new CWnd;
m_pControl->CreateControl(strControlProgid,
                          "",
                          WS_VISIBLE, 
                          rc,
                          this,
                          5000,
                          NULL,
                          FALSE,
                          NULL);
// ...
m_pControl->DestroyWindow();
delete m_pControl;

我们已经使用此方法销毁了ActiveX,但我仍然需要退出应用程序才能覆盖ocx

编辑:
或者,对于VC++ 6(使用MFC42),而不是Noseratio在他的答案中提到的CoFreeUnusedLibrariesEx;我可以使用CoFreeUnusedLibraries,它可以毫不拖延地适用于单线程公寓(STA)。

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