activeXコントロールをホストする<オブジェクト>タグにihtmlelementポインターを取得する方法

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

質問

Firebreathフレームワーク(http://firebreath.org)によって生成されたActiveXコントロールがあります。参照を取得する必要がありますu003Cobject>C ++のプラグインをホストするページにタグを付けます。

NPAPIを使用していた場合、npn_getValueを使用してNPNVPluginElementNPOBOBject定数を使用します。

ですから、私が明確になっていることを確認するために、ページに以下があるとします。

u003Cobject id="testPlugin" type="application/x-someplugin" width="100%" height="100%">u003C/object>

document.getElementByID( "testplugin")を使用した場合のように、プラグインへの参照を取得したい場合、そのmimetypeに挿入されたActivexコントロールのC ++コード内を除きます。

IDをasに渡すことに注意してくださいu003Cparam>私にとっては良い選択肢ではありませんが、機能する可能性のあるActiveXコントロール内からIDを取得する方法がある場合。

編集: GetElementsByTagnameを使用してDOMを介して見つけようとしていることを検討していますが、同じプラグインの2つのインスタンスの違いを見分けることは困難です。

役に立ちましたか?

解決

フィンランドのFirebreathの寄稿者Jtojanenのおかげで、ついに解決策があります。

最初のことは、comオブジェクトです しなければならない 「単一」ではなく「アパート」として登録されます(レジストリ内)。それ以外の場合、これは機能しません。 comのバグのようです。

その後、setclientsiteが呼び出された後、どこでも、次のことを行うことができます。

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

これが誰かに時間を節約することを願っています。私のためにこれに答えることができる人を見つけるのにほぼ2年かかりました。

HTMLELEMENTのオブジェクトは次のとおりですu003Cobject>プラグインをラップするタグを付けます。したがって、インターフェイスのいずれかをQueryInterfaceでQueryInterfaceで成功する必要がありますが、実際には文字通りオブジェクトではない場合がありますが、オブジェクトのラッパーになる可能性があります。

他のヒント

C#:

    public int SetSite(object site)
    {
        if (site != null)
        {
            var oleControl = (IOleControlSite)site;
            object oHtmlElement;
            oleControl.GetExtendedControl(out oHtmlElement);
            var htmlElement = (IHTMLElement2)oHtmlElement;
            ...
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top