在 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
对象。然后可以将其强制转换为 IDocHostUIHandler
或 IOleCommandTarget
,以便从原始处理程序/目标上的这些接口(interface)调用方法。
这是来自 C# BHO 的 DocumentComplete 事件的示例代码片段(Explorer
是 ShDocVw.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/