Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 在ATL COM对象中创建回调函数并在JScript中使用_Visual Studio_Visual C++_Com_Jscript - Fatal编程技术网

Visual studio 在ATL COM对象中创建回调函数并在JScript中使用

Visual studio 在ATL COM对象中创建回调函数并在JScript中使用,visual-studio,visual-c++,com,jscript,Visual Studio,Visual C++,Com,Jscript,我已经使用visualc++ATL项目创建了COM对象,其中有一个函数tst2,它在sigle参数中传递int 我可以很容易地从JScript中完成这一切: c= new ActiveXObject("myC2.1"); c.tst2(1); 但是现在我需要在我的COM中创建并使用回调函数,并在JScript中使用回调函数。我想JScript端应该是这样的: c.onHello = function() { WScript.Echo("onHello"); }; 但是如何在COM中创

我已经使用
visualc++
ATL项目创建了COM对象,其中有一个函数
tst2
,它在sigle参数中传递int

我可以很容易地从JScript中完成这一切:

c= new ActiveXObject("myC2.1");
c.tst2(1);
但是现在我需要在我的
COM
中创建并使用回调函数,并在
JScript
中使用回调函数。我想
JScript
端应该是这样的:

c.onHello = function() {
    WScript.Echo("onHello");
};
但是如何在
COM
中创建这样的函数呢?我想我需要在Hello上添加属性
,但我需要选择哪种属性类型

UPD

根据now,我有一个回调函数function
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>

属性类型是
IDispatch*
VARIANT
,它将保存
IDispatch*
值,查找(例如,或者甚至更好)如何进行实际调用(使用
IDispatch::Invoke
)。这很好,但如果需要参数回调函数,如何处理?body
DISPPARAMS
中的Mor edetails可能包含其他参数。
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;
}
function Func(string)
{

}