the documentation of the IDocHostUIHandler Interface 中,有一段关于 IE 提供的默认 UI 处理程序,当谈论使用 BHO 中的 ICustomDoc 导致的内存泄漏时:

To avoid a memory leak:

 1. Always forward the IDocHostUIHandler::ShowUI and
IDocHostUIHandler::HideUI methods to the original handler.
 2. Release the pointer to the original UI handler when your object is called
with IObjectWithSite::SetSite(NULL).

如何获取主机接口(interface)以释放它?

最佳答案

虽然不受官方支持,但您仍然可以获得对原始 IDocHostUIHandler 的引用,以便在您不打算在 BHO 中覆盖的所有方法上传递调用。

首先将文档转换为 IOleObject,然后调用 GetClientSite 以获得原始的 IOleClientSite 对象。然后可以将其强制转换为 IDocHostUIHandlerIOleCommandTarget,以便从原始处理程序/目标上的这些接口(interface)调用方法。

这是来自 C# BHO 的 DocumentComplete 事件的示例代码片段(ExplorerShDocVw.WebBrowserClass 的一个实例,UIHandler 是我自己的 IDocHostUIHandler 类,它将调用传递给在初始化程序中传递的对象,并且所有接口(interface)都直接取自 http://pinvoke.net ):

IOleObject obj = Explorer.Document as IOleObject;
if (obj != null)
{
    IOleClientSite cs = null;
    obj.GetClientSite(ref cs);

    if (cs != null)
    {
        ICustomDoc cDoc = Explorer.Document as ICustomDoc;
        if (cDoc != null)
        {
            cDoc.SetUIHandler(new UIHandler(cs));
        }
    }
}

这是从 PopupBlocker 项目中可用的 C++ 代码改编而来的 http://www.codeproject.com/Articles/4003/Popup-Window-Blocker

关于internet-explorer - 如何获取Internet Explorer 提供的原始IDocHostUIHandler?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7701465/

10-13 06:57