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,我有一个回调函数functionfunction 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
)。这很好,但如果需要参数回调函数,如何处理?bodyDISPPARAMS
中的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,
¶ms, &vResult,
NULL, NULL);
return S_OK;
}
function Func(string)
{
}