Wie man einen IHTMLElement Zeiger auf den -Tag erhält eine ActiveX-Steuerelement-Hosting

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

Frage

Ich habe ein ActiveX-Steuerelement, die durch den firebreath Rahmen (http://firebreath.org). Ich brauche einen Verweis auf den -Tag auf der Seite, dass Hosts das Plugin von C ++ zu erhalten.

Wenn ich NPAPI verwendet haben, würde ich die NPNVPluginElementNPObject konstant mit NPN_GetValue verwenden.

so sicherstellen, dass ich klar bin zu sein, sagen, ich habe folgend auf der Seite:

Ich mag einen Verweis auf das Plugin bekommen, wie ich würde, wenn ich document.getElementById verwendet ( „Testplugin“), mit Ausnahme von innerhalb des C ++ Code des ActiveX-Steuerelement, das für diesen MIME-Typen eingeführt wird.

Bitte beachten Sie, dass das Bestehen der ID in als ist keine gute Option für mich, aber wenn es eine Möglichkeit, die ID aus dem Innern des ActiveX-Steuerelement zu erhalten, die arbeiten kann.

bearbeiten. Ich erwäge mit getElementsByTagName und versuchen, es durch das DOM zu finden, aber es wäre schwierig, den Unterschied zwischen zwei Instanzen des gleichen Plugin zu sagen

War es hilfreich?

Lösung

Dank firebreath Beitrag jtojanen aus Finnland haben wir endlich eine Lösung.

Die erste Sache ist, dass das COM-Objekt muss als "Wohnung" registriert wird, nicht "Single" (in der Registrierung). Andernfalls wird dies nicht funktionieren; scheint in COM ein Bug zu sein.

Dann überall nach SetClientSite aufgerufen wird, können Sie die folgenden Schritte ausführen:

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

Hope spart jemand einige Zeit; es hat mich fast 2 Jahre gedauert, jemanden zu finden, das für mich beantworten konnte.

Das Objekt in Htmlelement wird das -Tag sein, dass Ihr Plugin wickelt; also, wenn Sie queryinterface für alle Ihre Schnittstellen, sollte es gelingen, aber es kann nicht wirklich buchstäblich Ihr Objekt, wird es wahrscheinlich ein Wrapper zu Ihrem Objekt sein.

Andere Tipps

In C #:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top