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_AGGREGATE は punk に転送します。 |
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 を追加して作成されます。 たとえば、x が IPersistStorage
の場合、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 を追加して作成されます。 たとえば、x が IPersistStorage
の場合、IID は IID_IPersistStorage
になります。