Хотя официально это не поддерживается, вы все равно можете получить ссылку на исходный IDocHostUIHandler
, чтобы пропустить вызовы по всем методам, которые вы не планируете переопределить в своем BHO.
Сначала выприведите документ как IOleObject
и затем вызовите GetClientSite
, чтобы получить исходный объект IOleClientSite
.Затем его можно привести к IDocHostUIHandler
или IOleCommandTarget
для вызова методов из этих интерфейсов исходного обработчика / цели.
Вот пример фрагмента кода из события DocumentComplete C # BHO(Explorer
- это экземпляр ShDocVw.WebBrowserClass
, UIHandler
- мой собственный класс IDocHostUIHandler
, который передает вызовы объекту, переданному в инициализаторе, и все интерфейсы были взяты непосредственно из 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));
}
}
}
Это было адаптировано из кода C ++, доступного в проекте PopupBlocker, доступном здесь http://www.codeproject.com/Articles/4003/Popup-Window-Blocker