Заставить нативные COM-методы работать как граждане первого класса в jscript

Мое приложение хостинг jscript (IActiveScriptIE9). Экспортирует интерфейс (двойной, 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 ответ

foo(host.my_method) также не работает корректно в чистом JavaScript; my_method не будет иметь доступа к host с помощью this, Правильный способ сделать это в JavaScript с помощью захвата:

foo( function (x) { return host.my_method(x); } );
Другие вопросы по тегам