使本机COM方法在jscript

时间:2015-06-25 22:09:25

标签: javascript c++ visual-c++ iactivescript

我的应用程序正在托管jscript(IActiveScript,IE9)。它向它导出一个接口(双IDispatch)(见下文)。我可以从jscript中调用它:

host.my_method(42);

但将其传递给另一个函数(或赋值给变量)不起作用:

function foo(f) { f(42); };
foo(host.my_method); // error 0x800a138f - Unable to get property 'my_method'

问题:如何让我的原生函数看起来像属性?

接口:

[
    object,
    dual,
    uuid(whatever),
    pointer_default(unique)
]
__interface IMyInterface
{
    [id(1), helpstring("My method")]
    HRESULT my_method([in] VARIANT * value);
};

以下是该界面的实现:

[
    coclass,
    event_source(com),
    threading(apartment),
    uuid(guid),
    noncreatable,
    aggregatable(never),
    default(IMyInterface)
]
class MyClass :
    public CComObjectRootEx<....>,
    public CComCoClass<MyClass>,
    public IDispatchImpl<IMyInterface>,
    public IProvideClassInfo2Impl<....>
{
    ...
    STDMETHOD(my_method)(/*[in]*/ VARIANT * value) override;
};

1 个答案:

答案 0 :(得分:0)

foo(host.my_method)在纯JavaScript中也无法正常工作; my_method无法通过host访问this。在JavaScript中执行此操作的正确方法是使用捕获:

foo( function (x) { return host.my_method(x); } );