Как только у вас есть указатель на элемент, для которого вы хотите получать события, вы QueryInterface()
сделаете это для IConnectionPointContainer
, а затем подключитесь к нему:
REFIID riid = DIID_HTMLFormElementEvents2;
CComPtr<IConnectionPointContainer> spcpc;
HRESULT hr = form->QueryInterface(IID_IConnectionPointContainer, (void**)&spcpc);
if (SUCCEEDED(hr))
{
CComPtr<IConnectionPoint> spcp;
hr = spcpc->FindConnectionPoint(riid, &spcp);
if (SUCCEEDED(hr))
{
DWORD dwCookie;
hr = pcp->Advise((IDispatch *)this, &dwCookie);
}
}
Некоторые заметки:
- Возможно, вы хотите кэшировать
dwCookie
и cpc
, поскольку они понадобятся вам позже, когда вы звоните pcp->Unadvise()
для отключения приемника.
- В звонке на
pcp->Advise()
выше я передаю это. Вы можете использовать любой имеющийся у вас объект, который реализует IDispatch
, который может быть или не быть этим объектом. Дизайн оставлен вам.
riid
будет интерфейсом события, который вы хотите поглотить. В этом случае вы, вероятно, захотите DIID_HTMLFormElementEvents2
.
Вот как отключить:
pcp->Unadvise(dwCookie);
Дайте мне знать, если у вас есть дополнительные вопросы.
Edit-1:
Да, этот DIID был неправ. Должно быть: DIID_HTMLFormElementEvents2
.
Вот как я это нашел:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK>findstr /spin /c:"Events2" *.h | findstr /i /c:"form"