|
|
|
date: Mon, 5 Mar 2007 16:20:32 -0800,
group: microsoft.public.inetsdk.programming.scripting.jscript
back
Re: Is <OBJECT> the only way in IE for an ActiveX control to sink events
"David Ching" wrote in message
news:12v0s6btmph9374@news.supernews.com...
> "Anthony Jones" wrote in message
> news:O0wFhC9XHHA.2448@TK2MSFTNGP02.phx.gbl...
> >
> > Is this control something you have written? If so what language?
> >
>
> Yes, the ActiveX control is my own and was created in C++/ATL.
>
> -- David
>
In that case an alternative to an event is to pass into your control a
JScript function:-
CComPtr<IDispatch> m_pOnSomeEvent;
STDMETHODIMP CYourClass::putref_onsomevent(LPDISPATCH newVal)
{
m_pOnSomeEvent = newVal;
return S_OK;
}
void CYourClass::raiseSomeEvent(ULONG SomeValue)
{
HRESULT hr;
if(m_pOnSomeEvent==NULL)
{
return;
}
DISPID dispid;
OLECHAR FAR* szMember = L"call";
DISPPARAMS dispparams;
VARIANTARG * pvarg = NULL;
hr = m_pOnSomeEvent->GetIDsOfNames(IID_NULL, &szMember, 1,
LOCALE_SYSTEM_DEFAULT, &dispid );
if (SUCCEEDED(hr))
{
pvarg = new VARIANTARG[2];
dispparams.rgvarg=pvarg;
dispparams.rgvarg[0].vt= VT_I4;
dispparams.rgvarg[0].intVal = SomeValue;
dispparams.rgvarg[1].vt= VT_DISPATCH;
this->QueryInterface(IID_IDispatch,
(void**)&dispparams.rgvarg[1].pdispVal);
dispparams.cArgs=2;
dispparams.cNamedArgs = 0;
hr =
m_pOnSomeEvent->Invoke(dispid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD
,&dispparams, NULL, NULL, NULL);
delete(pvarg);
}
}
Now in your JScript code like this should work:-
var o = new ActiveXObject("YourLib.YourClass")
o.onsomeevent = fnOnSomeEvent
function fnOnSomeEvent(Value)
{
alert('Some Event value is :" + Value.toString())
}
Ok so it's not really an event, you can't use attachEvent but it ought to
work for what you seem to need.
Anthony.
date: Fri, 9 Mar 2007 09:55:45 -0000
author: Anthony Jones
|
|