2011-10-09 1 views
1

En the documentation of the IDocHostUIHandler Interface, il y a un paragraphe sur le gestionnaire d'interface utilisateur par défaut fourni par IE lorsque l'on parle d'une fuite de mémoire due à l'utilisation ICustomDoc d'un BHO:Comment obtenir l'IDocHostUIHandler d'origine fourni par Internet Explorer?

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

Comment obtenir l'interface hôte afin de le libérer?

+0

comment vous avez résolu problème 2? – walter

Répondre

2

Bien qu'il ne soit pas officiellement pris en charge, vous pouvez toujours obtenir une référence à l'original IDocHostUIHandler afin de passer des appels à travers toutes les méthodes que vous ne prévoyez pas de remplacer dans votre BHO.

Vous devez d'abord convertir le document en IOleObject, puis appeler le GetClientSite pour obtenir l'objet original IOleClientSite. Cela peut ensuite être converti en IDocHostUIHandler ou en IOleCommandTarget afin d'appeler les méthodes à partir de ces interfaces sur le gestionnaire/cible d'origine.

Voici un extrait de code exemple de l'événement DocumentComplete d'un C# BHO (Explorer est une instance de ShDocVw.WebBrowserClass, UIHandler est ma propre classe IDocHostUIHandler qui passe appels vers l'objet passé dans le initialiseur, et toutes les interfaces étaient pris directement à partir 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)); 
     } 
    } 
} 

Cela a été adapté à partir du code C++ disponible dans le projet PopupBlocker ici http://www.codeproject.com/Articles/4003/Popup-Window-Blocker

+0

c'est la seule chose qui a fonctionné pour moi pour résoudre le problème de déposer des fichiers. Sans cela, la suppression d'un fichier ne l'ouvrirait que sous la forme d'une URL, mais ne déclencherait pas les événements "drop" sur le DOM. Il suffit d'utiliser le IOleClientSite de l'implémentation GetDropTarget. –

1

Le passage entier se lit aujourd'hui

Il ne vise pas à remplacer un IDocHostUIHandler existant qui est fourni par Internet Explorer ou le contrôle WebBrowser. Si vous essayez remplacer cette interface à partir d'un objet BHO (Browser Helper Object) utilisant ICustomDoc, vous pouvez rencontrer un comportement inattendu tel que la fuite de mémoire .

Donc ce n'est simplement pas supporté ce que vous essayez de faire (au moins officiellement).