Podsumowanie obsługi zdarzeń ATL
Ogólnie rzecz biorąc, obsługa zdarzeń COM jest stosunkowo prostym procesem. Istnieją trzy główne kroki:
Zaimplementuj interfejs zdarzenia w obiekcie.
Poinformuj źródło zdarzeń, że obiekt chce odbierać zdarzenia.
Nienadzoruj źródło zdarzeń, gdy obiekt nie musi już odbierać zdarzeń.
Implementowanie interfejsu
Istnieją cztery główne sposoby implementowania interfejsu przy użyciu atl.
Wyprowadzanie z | Odpowiedni dla typu interfejsu | Wymaga zaimplementowania wszystkich metod* | Wymaga biblioteki typów w czasie wykonywania |
---|---|---|---|
Interfejs | Tabela wirtualna | Tak | Nie. |
IDispatchImpl | Podwójne | Tak | Tak |
IDispEventImpl | Dispinterface | Nie. | Tak |
IDispEventSimpleImpl | Dispinterface | Nie | Nie. |
* W przypadku używania klas obsługi ATL nigdy nie trzeba implementować IUnknown
metod lub IDispatch
ręcznie.
Doradzanie i nienadzorowanie źródła zdarzeń
Istnieją trzy główne sposoby doradzania i nienadzorowania źródła zdarzeń przy użyciu atl.
Porada, funkcja | Funkcja Unadvise | Najbardziej odpowiednie do użytku z | Wymaga śledzenia pliku cookie | Komentarze |
---|---|---|---|---|
AtlAdvise, CComPtrBase::Advise | AtlUnadvise | Interfejsy wirtualne lub podwójne | Tak | AtlAdvise jest globalną funkcją ATL. CComPtrBase::Advise jest używany przez CComPtr i CComQIPtr. |
IDispEventSimpleImpl::D ispEventAdvise | IDispEventSimpleImpl::D ispEventUnadvise | IDispEventImpl lub IDispEventSimpleImpl | Nie. | Mniejsza liczba parametrów niż AtlAdvise od czasu, gdy klasa bazowa wykonuje więcej pracy. |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | Kontrolki ActiveX w kontrolkach złożonych | Nie. | CComCompositeControl::AdviseSinkMap zaleca wszystkie wpisy na mapie ujścia zdarzeń. Ta sama funkcja nie nadzoruje wpisów. Ta metoda jest wywoływana automatycznie przez klasę CComCompositeControl . |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | Kontrolki ActiveX w oknie dialogowym | Nie. | CAxDialogImpl::AdviseSinkMap Zaleca i nie nadzoruje wszystkich kontrolek ActiveX w zasobie okna dialogowego. Odbywa się to automatycznie. |