【问题标题】:Making native COM methods work as first class citizens in jscript使本机 COM 方法在 jscript 中充当一等公民
【发布时间】:2015-06-25 22:09:24
【问题描述】:

我的应用程序托管 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;
};

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我已经在 IE 中尝试过 foo(window.alert) - 它可以在没有包装的情况下工作。这里window 是一个对象(就像我的host)。顺便说一句,window.alert.toString() 有效,而 host.my_method.toString() 无效。我的意思是,他们是怎么做到的?
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 2011-07-07
    • 1970-01-01
    • 2021-03-20
    • 2011-12-25
    • 1970-01-01
    • 2015-09-18
    • 2014-08-06
    相关资源
    最近更新 更多