質問: お世話になります。 ### 前提・実現したいこと 金曜日にさせていただいた質問( )の続きになります。 業務で必要になりActiveXとJavaScriptの連携サンプルを作成しておりますが、JavaSriptからActiveXを叩くとブラウザが落ちる現象がどうしても解消できなません。 ActiveXから取得する値に応じて、JavaScriptがそのページのDOMを操作するというのが最終的な目標なのですが、時間もなく、上に相談したところ「ActiveXから直接DOM操作できないのか」と言われました。 ### 試したこと 土日も使っていろいろ調べたのですが、見つかってもJScriptからActiveXObjectを作成して各種アプリを操作するサンプルばかりで、ActiveXから直接DOMを操作するようなサンプルは見つけられませんでした。 そもそも、ActiveXから直接DOMを操作することはできるのでしょうか? よろしくお願いいたします。
回答: BHOしか作成したことがないのでActiveXで出来るか不明ですが以下のような感じじゃないかと思います。 ただ、C++からDOM操作は面倒くさいのでJavaScriptのほうが実装が楽だと思います。 IUnknownを受け取るインターフェースをActiveXのクラスに追加 ``` HRESULT STDMETHODCALLTYPE Execute(IUnknown* document); ``` Javascriptでdocumentオブジェクトを指定してExecuteを実行 ``` activex_obj.Execute(document); ``` Executeの実装 ``` HRESULT STDMETHODCALLTYPE CHoge::Execute(IUnknown* document){ if(document == nullptr) return E_FAIL; //IHTMLDocument2のインターフェースを取得する IHTMLDocument2* doc2 = nullptr; HRESULT hr = document->QueryInterface(IID_IHTMLDocument2,&doc2); if(FAILED(hr)) return hr if(!doc2) return E_FAIL; //以下はDOM操作。 //例えば、getElementByIdがしたかったらIHTMLDocument3のインターフェースを取得して実行する //エラーチェックは省略 IHTMLDocument3* doc3 = nullptr; hr = doc2->QueryInterface(IID_IHTMLDocument3,&doc3); IHTMLElement* el = nullptr; hr = doc3->getElementById(_bstr_t(L"hogehoge"),&el); el->Release();//Releaseが面倒なので、普通はCOMのスマートポインタを使う doc3->Release(); doc2->Release(); return S_OK; } ```