braintag

公開してしまう備忘録

CDHtmlDialogから、javascript関数の呼び出し方法

[初回]MFCアプリケーションのユーザインタフェースをすべてJavascript(JQuery)におまかせしてしまう - braintag
[前回]CDHtmlDialogにて、html間の値の受け渡し方法 - braintag

これらの続きです。

呼び出すjavascriptの関数は以下のコード

<script type="text/javascript">
    function calljsfuncfromcpp() {
        alert("calljsfunc");
    }
</script>

execScriptを使う方法

CDHtmlDialogのメンバで以下のコードを実行

     CComPtr<IHTMLWindow2> HTML2Wind;
    m_spHtmlDoc->get_parentWindow(&HTML2Wind);

    BSTR langstr = ::SysAllocString(L"javascript");
    BSTR funcname = ::SysAllocString(L"calljsfuncfromcpp()");
    VARIANT vempty = {0};
    HTML2Wind->execScript(funcname, langstr, &vempty);
    SysFreeString(langstr);
    SysFreeString(funcname);

ただ、この方法は、戻り値がわかりません。
(vemptyに戻り値は入らない)

http://d.hatena.ne.jp/kinokorori/20090719
ここの手法が一番いいようです。

逆の方法、javascriptからC++のfunctionを呼び出す方法

ググるといろいろ方法はありそうで、以下をやってみましたがダメでした。

・DECLARE_DISPATCH_MAP,window.externalを使う方法(ActiveXの警告がどうしても消えない)
・IDispatchを継承して使う方法(トライしてみましたが、難しすぎて成功しませんでした)

仕方ないので、以下の方法でjavascriptからC++側のfunctionを呼びました。
html+javascript側の記述

function callcppfunc()
{
   $("callcppfunc").val("data");
   $("callcppfunc").trigger("click");
}
<input type="hidden" id="callcppfunc" onclick="callcppfunc()">

MFC側の方法
CDHtmlDialogのDHTML_EVENT_ONCLICKでイベントを受け取り、DDX_DHtml_ElementValueでデータ取得

以上の方法でお茶を濁しました。
当然、戻り値は返せませんので、工夫が必要です。