我使用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
,但我需要选择哪种属性类型?
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,
¶ms, &vResult,
NULL, NULL);
return S_OK;
}
这很好用。
但是,如果我需要将字符串参数传递给JScript的回调函数,该怎么处理?像fucntion那样的东西
function Func(string)
{
}