activeXコントロールをホストする<オブジェクト>タグにihtmlelementポインターを取得する方法
-
29-09-2019 - |
質問
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;
...
}
}