IDispEventSimpleImpl クラス
更新 : 2007 年 11 月
このクラスは IDispatch メソッドの実装を提供しますが、タイプ ライブラリからはタイプ情報が取得されません。
template <
UINT nID,
class T,
const IID* pdiid
>
class ATL_NO_VTABLE IDispEventSimpleImpl :
public _IDispEventLocator<nID, pdiid>
パラメータ
nID
ソース オブジェクトの一意の識別子。IDispEventSimpleImpl が複合コントロールの基本クラスの場合は、必要なコンテナ内のコントロールのリソース ID を使用します。それ以外の場合は、任意の正の整数を使用します。T
IDispEventSimpleImpl から派生されるユーザーのクラス。pdiid
このクラスで実装されるイベントのディスパッチ インターフェイスの IID へのポインタ。
解説
IDispEventSimpleImpl では、インターフェイスのメソッドやイベントごとに実装コードを指定せずにイベントのディスパッチ インターフェイスを実装する方法が用意されています。IDispEventSimpleImpl は IDispatch メソッドの実装を提供します。指定する必要があるのは、処理の対象となるイベントの実装だけです。
IDispEventSimpleImpl はクラスのイベント シンク マップと連動し、適切なハンドラ関数にイベントをルーティングします。このクラスを使用するには、次の手順に従います。
処理する各オブジェクトのイベントごとに、イベント シンク マップに SINK_ENTRY_INFO マクロを追加します。
各エントリのパラメータとして _ATL_FUNC_INFO 構造体へのポインタを渡すことによってイベントごとに型情報を指定します。x86 プラットフォームでは、_ATL_FUNC_INFO.cc の値を CC_CDECL とし、コールバック関数で __stdcall のメソッドを呼び出す必要があります。スマート デバイスの開発者の方は、以下の「スマート デバイス開発者のためのメモ」を参照してください。
DispEventAdvise を呼び出して、ソース オブジェクトと基本クラス間の接続を確立します。
接続を解除するには、DispEventUnadvise を呼び出します。
イベントを処理する必要のあるオブジェクトごとに、nID に一意の値を指定して IDispEventSimpleImpl から派生させる必要があります。あるソース オブジェクトに対するアドバイズを中止してから別のソース オブジェクトに対してアドバイズすることによって基本クラスを再利用できますが、一度に 1 つのオブジェクトで処理できるソース オブジェクトの最大数は IDispEventSimpleImpl 基本クラスの数によって制限されます。
IDispEventSimplImpl の機能は IDispEventImpl と同じですが、IDispEventSimplImpl ではタイプ ライブラリからインターフェイスの型情報を取得しません。ウィザードでは IDispEventImpl だけに基づいてコードを生成しますが、手動でコードを追加すると IDispEventSimpleImpl を使用できます。イベント インターフェイスを記述するタイプ ライブラリがない場合、またはタイプ ライブラリの使用に関連するオーバーヘッドを回避する場合は、IDispEventSimpleImpl を使用します。
メモ : |
---|
IDispEventImpl と IDispEventSimpleImpl には、IUnknown::QueryInterface の独自の実装が用意されています。この実装により、IDispEventImpl 基本クラスまたは IDispEventSimpleImpl 基本クラスは別個の COM ID として機能する一方で、メイン COM オブジェクトのクラス メンバに直接アクセスできます。 |
ActiveX イベント シンクの CE ATL 実装は、HRESULT の戻り値またはイベント ハンドラからの void のみをサポートします。その他の戻り値はサポートされていないため、動作は定義されません。
詳細については、「IDispEventImpl のサポート」を参照してください。
必要条件
ヘッダー : atlcom.h
スマート デバイス開発者のためのメモ
IDispEventSimpleImpl では、_ATL_FUNC_INFO.cc メンバを CC_STDCALL にする必要がありますが、CE では CC_CDECL しかサポートされません。この点は、Pocket PC の場合と明らかに矛盾しますが、コールバックは _ATL_FUNC_INFO.cc の値 (コールバック メソッドの呼び出し規約) に関係なく機能します。次の例は、Pocket PC のサンプル イベント ハンドラです。
_ATL_FUNC_INFO Event1Info1 = { CC_CDECL, VT_EMPTY, 1, { VT_I4 } };
class CEventHandler :
public IDispEventSimpleImpl<1234, CEventHandler, &__uuidof(DMyEventMakerEvents)>
{
public:
BEGIN_SINK_MAP(CEventHandler)
SINK_ENTRY_INFO(1234, __uuidof(DMyEventMakerEvents), 1,
&CEventHandler::OnEvent1, &Event1Info1)
END_SINK_MAP()
void __stdcall OnEvent1(LONG l)
{
if (l != 445533)
{
OutputDebugString(L"l is not 445533\n");
}
}
HRESULT Advise1234(IUnknown * punk)
{
return IDispEventSimpleImpl<1234, CEventHandler,
&__uuidof(DMyEventMakerEvents)>::DispEventAdvise(punk);
}
};