Comment obtenir un pointeur IHTMLElement à la balise
-
29-09-2019 - |
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
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
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
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;
...
}
}