在ATL COM对象中创建回调函数并在JScript

时间:2016-02-20 17:27:13

标签: visual-studio visual-c++ com jscript

我使用Visual c++ ATL项目创建了COM对象,其中一个函数tst2在sigle参数中传递int。

我可以轻松地从JScript中获取:

c= new ActiveXObject("myC2.1");
c.tst2(1);

但现在我需要在COM中创建和使用回调函数,并在JScript中使用。我认为JScript方面看起来像:

c.onHello = function() {
    WScript.Echo("onHello");
};

但如何在COM中创建此类功能?我想我需要添加属性onHello,但我需要选择哪种属性类型?

enter image description here

UPD。

根据dscription现在,我有一个没有参数的回调函数function Func()的对象。

在JScript中:

<HTML>
<HEAD>
    <TITLE>ATL 3.0 test page for object ScriptCallback</TITLE>
    <SCRIPT>
// The callback function
//
function Func()
{
    // Alert on activation and test context
    alert(this.Callback.toString());
}

// Connect the script callback
// Wait until page (and the control) are fully loaded
//
function Loaded()
{
    ScriptCallback.Callback = Func;
}
window.onload = Loaded;
    </SCRIPT>
</HEAD>
<BODY>
    <OBJECT ID="ScriptCallback" 
        CLASSID="CLSID:986FB4FE-75D8-4D1C-9D9C-A755F15C2C8C"
        HEIGHT=1 WIDTH=1>
    </OBJECT>
</BODY>
</HTML>

COM C ++代码:

STDMETHODIMP CScriptCallback::get_Callback(VARIANT* pVal)
{
    // Return copy of current value
    return VariantCopy(pVal, &m_vCallback);
}

STDMETHODIMP CScriptCallback::put_Callback(VARIANT newVal)
{
    // Verify correct argument type
    if ( newVal.vt != VT_NULL && newVal.vt != VT_DISPATCH )
        return E_INVALIDARG;

    // Copy the reference value
    HRESULT hResult = m_vCallback.Copy(&newVal);
    if ( FAILED(hResult) )
        return hResult;

    // If set to null then we are done
    if ( m_vCallback.vt == VT_NULL )
        return S_FALSE;

    // If callback provided invoke it
    DISPID dispidThis = DISPID_THIS;
    CComVariant vThis(static_cast<IDispatch*>(this));
    DISPPARAMS params = { &vThis, &dispidThis, 1, 1};
    CComVariant vResult;
    m_vCallback.pdispVal->Invoke(DISPID_VALUE, IID_NULL, 
                                 LOCALE_USER_DEFAULT, DISPATCH_METHOD,
                                 &params, &vResult,
                                 NULL, NULL);
    return S_OK;
}

这很好用。

但是,如果我需要将字符串参数传递给JScript的回调函数,该怎么处理?像fucntion那样的东西

function Func(string)
{

}

0 个答案:

没有答案