Shrnutí zpracování událostí ATL
Obecně platí, že zpracování událostí modelu COM je poměrně jednoduchý proces. Existují tři hlavní kroky:
Implementujte rozhraní událostí na objektu.
Poradit zdroj událostí, že objekt chce přijímat události.
Zdroj událostí unadvise, když objekt už nemusí přijímat události.
Implementace rozhraní
Existují čtyři hlavní způsoby implementace rozhraní pomocí KNIHOVNY ATL.
Odvození od | Vhodné pro typ rozhraní | Vyžaduje, abyste implementovali všechny metody* | Vyžaduje knihovnu typů za běhu. |
---|---|---|---|
Rozhraní | Tabulka Vtable | Yes | No |
IDispatchImpl | Duální | Ano | Yes |
IDispEventImpl | Dispinterface | No | Ano |
IDispEventSimpleImpl | Dispinterface | No | Ne |
* Při použití tříd podpory ATL se nikdy nepotřebujete k ruční implementaci IUnknown
nebo IDispatch
metod.
Poradenství a přiřazení zdroje událostí
Existují tři hlavní způsoby, jak doporučovat a nepřidružovat zdroj událostí pomocí knihovny ATL.
Radit funkci | Unadvise – funkce | Nejvhodnější pro použití s | Vyžaduje, abyste sledovali soubor cookie. | Komentáře |
---|---|---|---|---|
AtlAdvise, CComPtrBase::Radte | AtlUnadvise | Virtuální nebo duální rozhraní | Ano | AtlAdvise je globální funkce ATL. CComPtrBase::Advise používá CComPtr a CComQIPtr. |
IDispEventSimpleImpl::D ispEventAdvise | IDispEventSimpleImpl::D ispEventUnadvise | IDispEventImpl nebo IDispEventSimpleImpl | No | Méně parametrů než AtlAdvise proto, že základní třída pracuje více. |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | Ovládací prvky ActiveX ve složených ovládacích prvcích | No | CComCompositeControl::AdviseSinkMap radí všechny položky v mapě jímky událostí. Stejná funkce unadvises položky. Tato metoda je volána automaticky CComCompositeControl třídou. |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | Ovládací prvky ActiveX v dialogovém okně | No | CAxDialogImpl::AdviseSinkMap radí a nepřipojí všechny ovládací prvky ActiveX v prostředku dialogového okna. To se provádí automaticky za vás. |