Come ottenere un puntatore IHTMLElement al tag che ospita un controllo ActiveX

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

Domanda

Ho un controllo ActiveX generato dal quadro dello sputare fuoco (http://firebreath.org). Ho bisogno di ottenere un riferimento al tag nella pagina che ospita il plugin dal C ++.

Se dovessi usare NPAPI, vorrei utilizzare la costante NPNVPluginElementNPObject con NPN_GetValue.

in modo da assicurarsi che io sia chiaro, dire che ho il seguente nella pagina:

Voglio ottenere un riferimento al plugin come farei se ho usato document.getElementById ( "testPlugin"), ad eccezione all'interno del codice C ++ del controllo ActiveX che viene inserito per questo tipo MIME.

Si noti che passando l'id come un non è una buona opzione per me, ma se c'è un modo per ottenere l'ID dall'interno del controllo ActiveX che può funzionare.

modifica:. che sto considerando se usare getElementsByTagName e cercando di trovare attraverso il DOM, ma sarebbe difficile capire la differenza tra due istanze dello stesso plug-in

È stato utile?

Soluzione

Grazie a sputare fuoco collaboratore jtojanen dalla Finlandia, finalmente abbiamo una soluzione.

La prima cosa è che l'oggetto COM deve essere registrato come "Apartment", non è "Single" (nel Registro di sistema). In caso contrario, questo non funzionerà; sembra essere un bug nel COM.

Quindi ovunque dopo SetClientSite, è possibile effettuare le seguenti operazioni:

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

Spero che questo consente di risparmiare qualcuno un po 'di tempo; mi c'è voluto quasi 2 anni per trovare qualcuno che potesse rispondere a questa domanda per me.

L'oggetto in HTMLElement sarà il tag che avvolge il plugin; quindi se QueryInterface per le tue interfacce, si dovrebbe riuscire, ma non può in realtà essere letteralmente l'oggetto, sarà probabilmente un wrapper per l'oggetto.

Altri suggerimenti

In C #:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top