Re: how to add an event handler for a dynamically created ActiveX
thx for this advice, i tried this too already.
// Sink Class
class ATL_NO_VTABLE CSinkEvent :
public IDispEventImpl<1, CSinkEvent,
&DIID__IExSliderCtrlEvents,
&LIBID_Controls, 1, 0>
{
public:
CSinkEvent(){}
BEGIN_SINK_MAP(CSinkEvent)
SINK_ENTRY_EX(1, DIID__IExSliderCtrlEvents, 1, PositionChanged)
END_SINK_MAP()
HRESULT __stdcall PositionChanged(long nPosition) {return S_OK;}
};
// Main Class
m_wndSlider = new CAxWindow();
m_wndSlider->Create(..create slider here..);
CComQIPtr<IExSliderCtrl> pSlider;
m_wndSlider->QueryControl(IID_IExSliderCtrl, (void**)&pSlider);
m_pSinkEvent = new CSinkEvent();
m_pSinkEvent->DispEventAdvise((IUnknown*)pSlider); // exception here
First, what is the major and minor version of the type library? I couldn't
find any useful information concerning these parameters.
Because of the exception:
The DispEventAdvise calls IDispEventSimpleImpl::DispEventAdvise then
_IDispEvent::DispEventAdvise then AtlAdvice. Finally here is the Problem:
He does not step into "QueryInterface" and the pUnkCP gets NULL after this
Line and throws exception.
ATLINLINE ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk,
const IID& iid, LPDWORD pdw)
{
if(pUnkCP == NULL)
return E_INVALIDARG;
CComPtr<IConnectionPointContainer> pCPC; // does not step into here!!!
CComPtr<IConnectionPoint> pCP; // does not step into here!!!
// and does not step into here!!!
HRESULT hRes =
pUnkCP->QueryInterface(__uuidof(IConnectionPointContainer),
(void**)&pCPC);
// pUnkCP = NULL after the above Line!
if (SUCCEEDED(hRes))
hRes = pCPC->FindConnectionPoint(iid, &pCP); // exception here
if (SUCCEEDED(hRes))
hRes = pCP->Advise(pUnk, pdw);
return hRes;
}
Sry for be annoying, but this stuff drives me crazy.
thx titanico.
"Igor Tandetnik" wrote:
"titanico" <titanico@discussions.microsoft.com> wrote in message
news:98DC0748-AC63-4613-92DF-69C35E1BF479@microsoft.com
for completeness the sink class implementation:
class ATL_NO_VTABLE CSinkEvent :
public IDispEventImpl<1, CSinkEvent>
You need to specify more parameters to IDispEventImpl - the DIID, the
LIBID and the major and minor version numbers of the type library.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925