none
如何动态释放 AxtiveX 控件 RRS feed

  • 问题

  • 我使用 CWnd::CreateControl 方法 加载了一个 ActiveX 控件  abc.ocx 文件

    然后调用 CWnd::DestroyWindow 方法销毁了控件窗口,但是 主程序 仍然一直占用着 abc.ocx 文件

    请问这是怎么回事啊,如何让 主程序不在占用着 abc.ocx?

    2017年7月27日 9:24

全部回复

  • Hi will_abc,

    感谢在MSDN论坛发帖。

    >>我使用 CWnd::CreateControl 方法 加载了一个 ActiveX 控件  abc.ocx 文件

    然后调用 CWnd::DestroyWindow 方法销毁了控件窗口,但是 主程序 仍然一直占用着 abc.ocx 文件

    请问这是怎么回事啊,如何让 主程序不在占用着 abc.ocx?

    如果你的控件支持非窗口激活,那么在离开或者关闭页面的时候控件的WM_DESTORY处理代码不会被调用。

    你可以使你的控件继承自COleControl并重写COleControl::OnSetClientSite函数,在该函数中通过判断m_pClientSite是否为空指针来判断控件是被加载还是被清除。例如:

    void CMyControl::OnSetClientSite()
    {
        if (m_pClientSite) 
           CreateControl(...);
        else
            DestroyWindow(); 
        COleControl::OnSetClientSite();
    }

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    2017年7月28日 2:03
  • 感谢你的回答,但是我依然删不掉 abc.ocx
    2017年7月28日 6:33
  • 在示例 Tstcon 里找到答案了,

    原来 DestroyWindow() 以后调用一下 CoFreeUnusedLibraries() 就行了

    • 已编辑 will_abc 2017年7月28日 6:54
    • 已建议为答案 Baron Bi 2017年7月28日 7:00
    2017年7月28日 6:54
  • Hi will_abc

    如果你的问题已经解决了,请标记可用答案。

    谢谢你的理解与支持。

    Best Regards,
    Sera Yu


    MSDN Community Support<br/> Please remember to click &quot;Mark as Answer&quot; the responses that resolved your issue, and to click &quot;Unmark as Answer&quot; if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact <a href="mailto:MSDNFSF@microsoft.com">MSDNFSF@microsoft.com</a>.

    2017年8月4日 7:07