次の方法で共有


COM_INTERFACE_ENTRY マクロ

これらのマクロは、オブジェクトのインターフェイスを COM マップに入力して、QueryInterface でこれらをアクセスできるようにします。 COM マップ内のエントリの順序は、QueryInterface 中に一致する IID についてインターフェイスがチェックされる順序です。

マクロ 説明
COM_INTERFACE_ENTRY インターフェイスを COM インターフェイス マップに入力します。
COM_INTERFACE_ENTRY2 このマクロを使用して、2 つの継承ブランチを明確に区別します。
COM_INTERFACE_ENTRY_IID このマクロを使用して、インターフェイスを COM マップに入力し、その IID を指定します。
COM_INTERFACE_ENTRY2_IID 別の IID を指定できる点を除いて、COM_INTERFACE_ENTRY2 と同じです。
COM_INTERFACE_ENTRY_AGGREGATE iid によって識別されるインターフェイスに対してクエリが実行されると、COM_INTERFACE_ENTRY_AGGREGATEpunk に転送します。
COM_INTERFACE_ENTRY_AGGREGATE_BLIND IID に対してクエリが実行されると、そのクエリが punk に転送される点を除いて、COM_INTERFACE_ENTRY_AGGREGATE と同じです。
COM_INTERFACE_ENTRY_AUTOAGGREGATE punk が NULL の場合、clsid によって記述される集計が自動的に作成される点を除いて、COM_INTERFACE_ENTRY_AGGREGATE と同じです。
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND IID に対してクエリが実行されると、そのクエリが punk に転送され、punk が NULL の場合、clsid によって記述される集計が自動的に作成される点を除いて、COM_INTERFACE_ENTRY_AUTOAGGREGATE と同じです。
COM_INTERFACE_ENTRY_BREAK これにより、指定されたインターフェイスに対してクエリが実行されると、プログラムで DebugBreak が呼び出されます。
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF すべてのインスタンスのインターフェイス固有のデータを保存します。
COM_INTERFACE_ENTRY_TEAR_OFF ティアオフ インターフェイスを公開します。
COM_INTERFACE_ENTRY_CHAIN 処理が COM マップ内のこのエントリに達したとき、基底クラスの COM マップを処理します。
COM_INTERFACE_ENTRY_FUNC ATL の QueryInterface ロジックにフックするための一般的なメカニズム。
COM_INTERFACE_ENTRY_FUNC_BLIND IID に対するクエリが実行されると、func の呼び出しが行われる点を除いて、COM_INTERFACE_ENTRY_FUNC と同じです。
COM_INTERFACE_ENTRY_NOINTERFACE 指定されたインターフェイスに対してクエリが実行されると、E_NOINTERFACE を返し、COM マップの処理を終了します。

要件

ヘッダー: atlcom.h

COM_INTERFACE_ENTRY

インターフェイスを COM インターフェイス マップに入力します。

構文

COM_INTERFACE_ENTRY( x )

パラメーター

x
[入力] クラス オブジェクトが直接派生するインターフェイスの名前。

解説

通常、これは、最も頻繁に使用されるエントリの種類です。

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

要件

ヘッダー: atlcom.h

COM_INTERFACE_ENTRY2

このマクロを使用して、2 つの継承ブランチを明確に区別します。

COM_INTERFACE_ENTRY2(x, x2)

パラメーター

x
[入力] オブジェクトから公開するインターフェイスの名前。

x2
[入力] x が公開される継承ブランチの名前。

解説

たとえば、クラス オブジェクトを 2 つのデュアル インターフェイスから派生させる場合、IDispatch をどちらか一方のインターフェイスから取得できるため、COM_INTERFACE_ENTRY2 を使用して IDispatch を公開します。

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

このマクロを使用して、インターフェイスを COM マップに入力し、その IID を指定します。

COM_INTERFACE_ENTRY_IID(iid, x)

パラメーター

iid
[入力] 公開されるインターフェイスの GUID。

x
[入力] iid によって識別されるインターフェイスとして vtable が公開されるクラスの名前。

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

別の IID を指定できる点を除いて、COM_INTERFACE_ENTRY2 と同じです。

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

パラメーター

iid
[入力] 指定するインターフェイスの GUID。

x
[入力] クラス オブジェクトが直接派生するインターフェイスの名前。

x2
[入力] クラス オブジェクトが直接派生する 2 番目のインターフェイスの名前。

COM_INTERFACE_ENTRY_AGGREGATE

iid によって識別されるインターフェイスに対してクエリが実行されると、COM_INTERFACE_ENTRY_AGGREGATE は punk に転送します。

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

パラメーター

iid
[入力] クエリが実行されるインターフェイスの GUID。

punk
[入力] IUnknown ポインターの名前。

解説

punk パラメーターは、集計の内部不明値、または NULL を指すと見なされます。この場合、エントリは無視されます。 通常、FinalConstruct内の集計の CoCreate を実行します。

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

IID に対してクエリが実行されると、そのクエリが punk に転送される点を除いて、COM_INTERFACE_ENTRY_AGGREGATE と同じです。

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

パラメーター

punk
[入力] IUnknown ポインターの名前。

解説

インターフェイスのクエリが失敗した場合、COM マップの処理は続行されます。

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

punk が NULL の場合、clsid によって記述される集計が自動的に作成される点を除いて、COM_INTERFACE_ENTRY_AGGREGATE と同じです。

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

パラメーター

iid
[入力] クエリが実行されるインターフェイスの GUID。

punk
[入力] IUnknown ポインターの名前。 COM マップを含むクラスのメンバーである必要があります。

clsid
[入力] punk が NULL の場合に作成される集計の識別子。

解説

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

IID に対してクエリが実行されると、そのクエリが punk に転送され、punk が NULL の場合、clsid によって記述される集計が自動的に作成される点を除いて、COM_INTERFACE_ENTRY_AUTOAGGREGATE と同じです。

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

パラメーター

punk
[入力] IUnknown ポインターの名前。 COM マップを含むクラスのメンバーである必要があります。

clsid
[入力] punk が NULL の場合に作成される集計の識別子。

解説

インターフェイスのクエリが失敗した場合、COM マップの処理は続行されます。

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

これにより、指定されたインターフェイスに対してクエリが実行されると、プログラムで DebugBreak が呼び出されます。

COM_INTERFACE_ENTRY_BREAK(x)

パラメーター

x
[入力] インターフェイス識別子の作成に使用されるテキスト。

解説

インターフェイス IID は、IID_x を追加して作成されます。 たとえば、xIPersistStorage の場合、IID は IID_IPersistStorage になります。

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

すべてのインスタンスのインターフェイス固有のデータを保存します。

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

パラメーター

iid
[入力] ティアオフ インターフェイスの GUID。

x
[入力] インターフェイスを実装するクラスの名前。

punk
[入力] IUnknown ポインターの名前。 COM マップを含むクラスのメンバーである必要があります。 クラス オブジェクトのコンストラクターで NULL に初期化する必要があります。

解説

インターフェイスを使用しない場合、これによって、オブジェクトのインスタンス全体のサイズが小さくなります。

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

ティアオフ インターフェイスを公開します。

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

パラメーター

iid
[入力] ティアオフ インターフェイスの GUID。

x
[入力] インターフェイスを実装するクラスの名前。

解説

ティアオフ インターフェイスは、それが表すインターフェイスに対してクエリが実行されるたびに、インスタンス化される個別のオブジェクトとして実装されます。 通常、インターフェイスをほとんど使用しない場合は、インターフェイスをティアオフとして構築します。これにより、メイン オブジェクトのすべてのインスタンスに vtable ポインターが保存されるためです。 参照カウントが 0 になると、ティアオフは削除されます。 ティアオフを実装するクラスは、CComTearOffObjectBase から派生し、独自の COM マップを持つ必要があります。

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

処理が COM マップ内のこのエントリに達したとき、基底クラスの COM マップを処理します。

COM_INTERFACE_ENTRY_CHAIN(classname)

パラメーター

classname
[入力] 現在のオブジェクトの基底クラス。

解説

たとえば、次のコードのようになります。

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM マップの最初のエントリは、COM マップを含むオブジェクト上のインターフェイスである必要があることに注意してください。 したがって、COM マップのエントリを COM_INTERFACE_ENTRY_CHAIN で開始することはできません。その場合、オブジェクトの COM マップに COM_INTERFACE_ENTRY_CHAIN(COtherObject) が表示される時点で別のオブジェクトの COM マップが検索されます。 別のオブジェクトの COM マップを最初に検索する場合は、IUnknown のインターフェイス エントリを COM マップに追加し、他方のオブジェクトの COM マップをチェーンします。 次に例を示します。

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

ATL の QueryInterface ロジックにフックするための一般的なメカニズム。

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

パラメーター

iid
[入力] 公開されるインターフェイスの GUID。

dw
[入力] func に渡されるパラメーター。

func
[入力] iid を返す関数ポインター。

解説

iid が、クエリが実行されるインターフェイスの IID と一致する場合、func で指定された関数が呼び出されます。 関数の宣言は、次のようになります。

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

関数が呼び出されると、pv はクラス オブジェクトをポイントします。 riid パラメーターは、クエリが実行されるインターフェイスを参照し、ppv は、関数でインターフェイスへのポインターを格納する必要がある場所へのポインターであり、dw は、エントリで指定したパラメーターです。 関数は、インターフェイスを返さないことが選択されている場合、* ppv を NULL に設し、E_NOINTERFACE または S_FALSE を返す必要があります。 E_NOINTERFACE の場合、COM マップの処理は終了します。 S_FALSE の場合、インターフェイス ポインターが返されなくても、COM マップの処理は続行されます。 関数はインターフェイス ポインターを返す場合、S_OK を返す必要があります。

COM_INTERFACE_ENTRY_FUNC_BLIND

IID に対するクエリが実行されると、func の呼び出しが行われる点を除いて、COM_INTERFACE_ENTRY_FUNC と同じです。

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

パラメーター

dw
[入力] func に渡されるパラメーター。

func
[入力] COM マップ内のこのエントリが処理されるときに呼び出される関数。

解説

失敗すると、COM マップの処理は続行されます。 関数はインターフェイス ポインターを返す場合、S_OK を返す必要があります。

COM_INTERFACE_ENTRY_NOINTERFACE

指定されたインターフェイスに対してクエリが実行されると、E_NOINTERFACE を返し、COM マップの処理を終了します。

COM_INTERFACE_ENTRY_NOINTERFACE(x)

パラメーター

x
[入力] インターフェイス識別子の作成に使用されるテキスト。

解説

このマクロを使用すると、特定のケースでインターフェイスが使用されるのを防ぐことができます。 たとえば、COM マップで、COM_INTERFACE_ENTRY_AGGREGATE_BLIND の直前にこのマクロを挿入して、インターフェイスに対するクエリが集計の内部の不明値に転送されるのを防ぐことができます。

インターフェイス IID は、IID_x を追加して作成されます。 たとえば、xIPersistStorage の場合、IID は IID_IPersistStorage になります。