Как получить оригинальный IDocHostUIHandler, предоставленный Internet Explorer? - PullRequest
2 голосов
/ 09 октября 2011

В документации по интерфейсу IDocHostUIHandler есть абзац об обработчике пользовательского интерфейса по умолчанию, предоставляемом IE, когда говорится об утечке памяти, вызванной использованием ICustomDoc из BHO:

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).

Как получить интерфейс хоста, чтобы его освободить?

Ответы [ 2 ]

3 голосов
/ 21 июня 2012

Хотя официально это не поддерживается, вы все равно можете получить ссылку на исходный 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

1 голос
/ 19 октября 2011

Весь отрывок в наши дни читается

Он не предназначен для замены существующего IDocHostUIHandler, который предоставляется Internet Explorer или элементом управления WebBrowser. Если вы попытаетесь заменить этот интерфейс из объекта Browser Helper Object (BHO), используя ICustomDoc, вы можете столкнуться с неожиданным поведением, таким как память Утечки.

Так что просто не поддерживается то, что вы пытаетесь сделать (по крайней мере, официально).

...