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でデータ取得
以上の方法でお茶を濁しました。
当然、戻り値は返せませんので、工夫が必要です。