Comment obtenir un pointeur IHTMLElement à la balise hébergement un contrôle activex

StackOverflow https://stackoverflow.com/questions/4103315

Question

I ai un contrôle ActiveX généré par le cadre de Firebreath (http://firebreath.org). Je dois obtenir une référence à la balise dans la page qui héberge le plug-in de C ++.

Si j'utilisais NPAPI, j'utiliser la constante NPNVPluginElementNPObject avec NPN_GetValue.

ainsi assurer que je suis être clair, disons que j'ai ce qui suit dans la page:

Je veux obtenir une référence au plugin comme je le ferais si je document.getElementById ( « TestPlugin »), sauf à partir du code C ++ du contrôle activeX qui est inséré pour ce type MIME.

S'il vous plaît noter que passer l'identifiant en tant est pas une bonne option pour moi, mais s'il y a un moyen d'obtenir l'ID de l'intérieur du contrôle activeX qui peut fonctionner.

modifier. J'envisage d'utiliser getElementsByTagName et essayer de le trouver dans les DOM, mais il serait difficile de faire la différence entre deux instances du même plug-in

Était-ce utile?

La solution

Merci à Firebreath contributeur jtojanen de la Finlande, nous avons enfin une solution.

La première chose est que l'objet COM doit être enregistré comme « Appartement », et non « Single » (dans le Registre). Dans le cas contraire, cela ne fonctionnera pas; semble être un bogue dans COM.

Alors partout après SetClientSite est appelé, vous pouvez faire ce qui suit:

CComQIPtr<IOleControlSite> site(m_spClientSite);
CComPtr<IDispatch> dispatch;
site->GetExtendedControl(&dispatch);
CComQIPtr<IHTMLElement2> htmlElement = dispatch;

L'espoir cela permet d'économiser quelqu'un quelque temps; il m'a fallu près de 2 ans pour trouver quelqu'un qui pourrait répondre à cela pour moi.

L'objet HTMLelement sera la balise qui enveloppe votre plug-in; donc si vous QueryInterface pour l'une de vos interfaces, il faut réussir, mais il ne peut pas réellement être littéralement votre objet, il sera probablement une enveloppe à votre objet.

Autres conseils

En C #:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top