2

Active Script JScript エンジンをホストするアプリケーションがあります。jscript.dll のバージョンによっては、JScript 5.8 まで動作します。アプリケーションは、多くのオブジェクトとメソッドを JScript 環境に公開します。

スクリプトが特定の関数を呼び出す場合、IDL は次のようになります。

HRESULT func(VARIANT varInput);

入力がinstanceof別の関数であるかどうか (つまり、関数がコンストラクターであり、そのプロトタイプが入力のプロトタイプ チェーンにあるかどうか) を判断したい。JScript の場合:

input instanceof Error

IDispatch/IDispatchEx を使用して C++ でこれを行うにはどうすればよいですか?

このメソッドは、IActiveScript (JScript エンジンによって実装される) および IActiveScriptSite (ホストによって実装される) インターフェイスにアクセスできるため、IActiveScript::GetScriptDispatch を使用してグローバル オブジェクトを取得Errorできます。取得しました。

4

3 に答える 3

0

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; }
    }
) ()

これが私の例の奇妙な表現を説明することを願っています。

于 2013-03-20T05:04:09.150 に答える
0

IDispatch*バリアントにラップしたにはDISPID_VALUE(= 0) プロパティがあり、オブジェクトの場合は文字Error列値 "[object Error]" が返されます。

次のような JScript 関数を定義または挿入することもできます。

function IsInstanceOf(object, type) {
    return object instanceof type;
}
function IsInstanceOfError(object) {
    return IsInstanceOf(object, Error);
}

IDispatch*JScriptエンジンが特定の型に対してそれをチェックし、そのようなチェックの真/偽の結果を返すためにすでに保持しているC++コードからそれらを呼び出します。

于 2012-09-10T10:49:37.857 に答える
-1

Java の instanceof 演算子に相当する C++ は、dynamic_cast を使用することです。例えば、

x instanceof y

C++ では次のようになります。

dynamic_cast<y*>(x) != 0
于 2012-09-08T23:59:48.747 に答える