Cómo obtener un puntero IHTMLElement a la etiqueta alojamiento de un control ActiveX

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

Pregunta

Tengo un control ActiveX generado por el marco FireBreath (http://firebreath.org). Necesito obtener una referencia a la etiqueta en la página que aloja el plugin desde C ++.

Si estuviera usando NPAPI, me gustaría utilizar la constante NPNVPluginElementNPObject con NPN_GetValue.

así que para asegurarse de que estoy siendo claro, decir que tengo lo siguiente en la página:

Quiero obtener una referencia al complemento como lo haría si usara document.getElementById ( "testPlugin"), excepto desde dentro del código C ++ del control ActiveX que se inserta para ese tipo MIME.

Tenga en cuenta que pasando el id en un no es una buena opción para mí, pero si hay una manera de obtener el ID desde dentro del control ActiveX que pueden trabajar.

editar:. Estoy pensando en utilizar getElementsByTagName y tratando de encontrar a través del DOM, pero sería difícil decir la diferencia entre dos instancias del mismo plug-in

¿Fue útil?

Solución

Gracias a FireBreath colaborador jtojanen desde Finlandia, que finalmente tienen una solución.

Lo primero es que el objeto COM debe se registrará como "Apartamento", no "individual" (en el Registro). De lo contrario, esto no funcionará; parece ser un error en COM.

A continuación, en cualquier lugar después SetClientSite se llama, puede hacer lo siguiente:

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

Espero que esto ahorra a alguien algún tiempo; que me ha llevado casi 2 años para encontrar a alguien que pudiera responder a esta para mí.

El objeto de HTMLElement será la etiqueta que envuelve su complemento; por lo que si QueryInterface para cualquiera de sus interfaces de, debería realizarse correctamente, pero no puede realmente ser, literalmente, su objeto, es probable que sea un envoltorio a su objeto.

Otros consejos

En C #:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top