ATL イベント処理の概要
一般に、COM イベントの処理は比較的単純なプロセスです。 主な手順が 3 つあります。
オブジェクトにイベントインターフェイスを実装する。
オブジェクトがイベントを受け取る必要があることをイベント ソースに通知する。
オブジェクトがイベントを受け取る必要がなくなったときに、イベント ソースの通知を解除する。
インターフェイスの実装
ATL を使用してインターフェイスを実装するとき、主に 4 つの方法があります。
派生元 | インターフェイス型に適している | すべてのメソッドを実装する必要がある* | 実行時にタイプ ライブラリが必要 |
---|---|---|---|
インターフェイス | Vtable | はい | いいえ |
IDispatchImpl | デュアル | はい | はい |
IDispEventImpl | Dispinterface | いいえ | はい |
IDispEventSimpleImpl | Dispinterface | いいえ | いいえ |
* ATL サポート クラスを利用するとき、IUnknown
または IDispatch
メソッドを手動で実装する必要はありません。
イベント ソースのアドバイスとアドバイス解除
ATL を使用してイベント ソースをアドバイスおよびアドバイス解除するには、主に 3 つの方法があります。
Advise 関数 | Unadvise 関数 | 次での使用に最適 | Cookie を追跡する必要がある | Comments |
---|---|---|---|---|
AtlAdvise, CComPtrBase::Advise | AtlUnadvise | Vtable またはデュアル インターフェイス | はい | AtlAdvise はグローバル ATL 関数です。 CComPtrBase::Advise は CComPtr と CComQIPtr によって使用されます。 |
IDispEventSimpleImpl::DispEventAdvise | IDispEventSimpleImpl::DispEventUnadvise | IDispEventImpl または IDispEventSimpleImpl | いいえ | 基底クラスがもっと多くの作業を行うため、パラメーターが AtlAdvise より少ない |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | 複合コントロールの ActiveX コントロール | いいえ | CComCompositeControl::AdviseSinkMap によって、イベント シンク マップのすべてのエントリがアドバイスされます。 同じ関数でエントリがアドバイズ解除されます。 このメソッドは CComCompositeControl クラスによって自動的に呼び出されます。 |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | ダイアログ ボックスの ActiveX コントロール | いいえ | CAxDialogImpl::AdviseSinkMap によって、ダイアログ リソースのすべての ActiveX コントロールがアドバイスされ、アドバイス解除されます。 これは自動的に行われます。 |