Come ottenere un puntatore IHTMLElement al tag
-
29-09-2019 - |
Domanda
Ho un controllo ActiveX generato dal quadro dello sputare fuoco (http://firebreath.org). Ho bisogno di ottenere un riferimento al tag
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
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
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;
...
}
}