Roman Rは良い答えだと思いますが、コードインジェクションを最小限に抑えるために、IActiveScriptParse::ParseScriptText
任意の匿名JavaScript関数をIDispatch
ポインターに変換するために使用できます。
HRESULT hr = S_OK;
EXCEPINFO ei = { };
CComVariant vIsErrorFunc;
hr = spIActiveScriptParse->ParseScriptText(
OLESTR("(function () { return function (obj) { return obj instanceof Error; }; } )();"), // pstrCode
NULL, // pstrItemName
NULL, // punkContent
NULL, // pstrDelimiter
0, // dwSourceContextCookie
0, // ulStartingLineNumber
SCRIPTTEXT_ISEXPRESSION, // dwFlags
&vIsErrorFunc, // pvarResult
&ei // pexcepinfo
);
匿名関数には便利なDISPIDがDISPID_VALUE
あり、を使用して起動できますIDispatch::Invoke
。にJavaScriptオブジェクトがあるVARIANT
場合は、次のようにテストできます。
// VARIANT* pvObject -- JavaScript object to test
DISPPARAMS dispParams = { pvObject, 0, 1, 0 };
CComVariant vResult;
hr = V_DISPATCH(&vIsErrorFunc)->Invoke(
DISPID_VALUE,
IID_NULL,
0,
DISPATCH_METHOD,
&dispParams,
&vResult,
NULL,
NULL);
vIsErrorFunc
匿名関数を繰り返し再利用できるように永続化することも、スコープ外に出してガベージコレクションを行うこともできます。いずれにせよ、JavaScriptエンジンのクライアントコードに永続的な影響はないはずです。
** 編集: **
元の無名関数が機能しないことがわかりました(VT_DISPATCHの代わりにVT_EMPTYを取得しました):
function (obj) { return obj instanceof Error; }
それをだますために、私は次のように関数をラップしました:
(
function ()
{
return function (obj) { return obj instanceof Error; }
}
) ()
これが私の例の奇妙な表現を説明することを願っています。