集計とクラス ファクトリに関するマクロ
以下のマクロは、集計を制御する方法と、クラス ファクトリを宣言する方法を提供します。
マクロ | 説明 |
---|---|
DECLARE_AGGREGATABLE | オブジェクトが集計できる (既定値) ことを宣言します。 |
DECLARE_CLASSFACTORY | クラス ファクトリが CComClassFactory (ATL の既定のクラス ファクトリ) であることを宣言します。 |
DECLARE_CLASSFACTORY_EX | クラス ファクトリ オブジェクトがクラス ファクトリであることを宣言します。 |
DECLARE_CLASSFACTORY2 | CComClassFactory2 がクラス ファクトリであることを宣言します。 |
DECLARE_CLASSFACTORY_AUTO_THREAD | CComClassFactoryAutoThread がクラス ファクトリであることを宣言します。 |
DECLARE_CLASSFACTORY_SINGLETON | CComClassFactorySingleton がクラス ファクトリであることを宣言します。 |
DECLARE_GET_CONTROLLING_UNKNOWN | 仮想 GetControllingUnknown 関数を宣言します。 |
DECLARE_NOT_AGGREGATABLE | オブジェクトを集計できないことを宣言します。 |
DECLARE_ONLY_AGGREGATABLE | オブジェクトを集計する必要があることを宣言します。 |
DECLARE_POLY_AGGREGATABLE | 外部の不明の値を確認し、必要に応じて、オブジェクトを集計可能または集計不可能として宣言します。 |
DECLARE_PROTECT_FINAL_CONSTRUCT | 内部オブジェクトの構築中に外部オブジェクトが削除されないように保護します。 |
DECLARE_VIEW_STATUS | コンテナーに VIEWSTATUS フラグを指定します。 |
要件
ヘッダー: atlcom.h
DECLARE_AGGREGATABLE
オブジェクトを集計できることを指定します。
DECLARE_AGGREGATABLE( x )
パラメーター
x
[入力] 集計可能として定義するクラスの名前。
解説
CComCoClass には、既定の集計モデルを指定するこのマクロが含まれます。 この既定値をオーバーライドするには、クラス定義で DECLARE_NOT_AGGREGATABLE または DECLARE_ONLY_AGGREGATABLE のいずれかのマクロを指定します。
例
class ATL_NO_VTABLE CNoAggClass :
public CComObjectRoot,
public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
CNoAggClass()
{
}
DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};
DECLARE_CLASSFACTORY
CComClassFactory がクラス ファクトリであることを宣言します。
DECLARE_CLASSFACTORY()
解説
CComCoClass では、このマクロを使用してオブジェクトの既定のクラス ファクトリを宣言します。
例
class ATL_NO_VTABLE CMyClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyClass, &CLSID_MyClass>,
public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
DECLARE_CLASSFACTORY()
// Remainder of class declaration omitted
CComClassFactory クラス
このクラスは、IClassFactory インターフェイスを実装します。
class CComClassFactory : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>
解説
CComClassFactory
は、IClassFactory インターフェイスを実装します。これには、特定の CLSID のオブジェクトを作成するためのメソッドと、新しいオブジェクトをより迅速に作成できるようにするためにクラス ファクトリをメモリにロックするためのメソッドが含まれます。 IClassFactory
は、システム レジストリに登録し、CLSID を割り当てるすべてのクラスに実装する必要があります。
通常、ATL オブジェクトは、クラス ファクトリを CComCoClass から派生させて取得します。 このクラスには、CComClassFactory
を既定のクラス ファクトリとして宣言する DECLARE_CLASSFACTORY マクロが含まれます。 この既定値をオーバーライドするには、クラス定義で、DECLARE_CLASSFACTORYXXX マクロのいずれかを指定します。 たとえば、DECLARE_CLASSFACTORY_EX マクロは、指定されたクラスをクラス ファクトリとして使用します。
class ATL_NO_VTABLE CMyCustomClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_CLASSFACTORY_EX(CMyClassFactory)
// Remainder of class declaration omitted.
上記のクラス定義では、CMyClassFactory
がオブジェクトの既定のクラス ファクトリとして使用されます。 CMyClassFactory
は、CComClassFactory
から派生して、CreateInstance
をオーバーライドする必要があります。
ATL にはこの他に、クラス ファクトリを宣言するマクロが 3 つあります。
DECLARE_CLASSFACTORY2: ライセンスによる作成を制御する CComClassFactory2 を使用します。
DECLARE_CLASSFACTORY_AUTO_THREAD: 複数のアパートメントにオブジェクトを作成する CComClassFactoryAutoThread を使用します。
DECLARE_CLASSFACTORY_SINGLETON: 1 つのCComObjectGlobal オブジェクトを構築する CComClassFactorySingleton を使用します。
DECLARE_CLASSFACTORY_EX
cf
がクラス ファクトリであることを宣言します。
DECLARE_CLASSFACTORY_EX( cf )
パラメーター
cf
[入力] クラス ファクトリ オブジェクトを実装するクラスの名前。
解説
cf パラメーターは、CComClassFactory から派生して、CreateInstance
メソッドをオーバーライドする必要があります。
CComCoClass には、CComClassFactory
を既定のクラス ファクトリとして指定する DECLARE_CLASSFACTORY マクロが含まれます。 ただし、オブジェクトのクラス定義に DECLARE_CLASSFACTORY_EX マクロを含めることにより、この既定値をオーバーライドできます。
例
class ATL_NO_VTABLE CMyCustomClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
DECLARE_CLASSFACTORY_EX(CMyClassFactory)
// Remainder of class declaration omitted.
DECLARE_CLASSFACTORY2
CComClassFactory2 がクラス ファクトリであることを宣言します。
DECLARE_CLASSFACTORY2( lic )
パラメーター
lic
[入力] VerifyLicenseKey
、GetLicenseKey
、IsLicenseValid
を実装するクラス。
解説
CComCoClass には、CComClassFactory を既定のクラス ファクトリとして指定する DECLARE_CLASSFACTORY マクロが含まれます。 ただし、オブジェクトのクラス定義に DECLARE_CLASSFACTORY2 マクロを含めることにより、この既定値をオーバーライドできます。
例
class ATL_NO_VTABLE CMyClass2 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyClass2, &CLSID_MyClass>,
public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
DECLARE_CLASSFACTORY2(CMyLicense)
// Remainder of class declaration omitted
CComClassFactory2 クラス
このクラスは、IClassFactory2 インターフェイスを実装します。
template <class license>
class CComClassFactory2 : public IClassFactory2,
public CComObjectRootEx<CComGlobalsThreadModel>,
public license
パラメーター
license (ライセンス)
次の静的関数を実装するクラス。
static BOOL VerifyLicenseKey( BSTR bstr );
static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );
static BOOL IsLicenseValid( );
解説
CComClassFactory2
は、IClassFactoryの拡張機能である IClassFactory2 インターフェイスを実装します。 IClassFactory2
は、ライセンスによるオブジェクトの作成を制御します。 ライセンスが付与されたマシンで実行されるクラス ファクトリは、実行時ライセンス キーを提供できます。 このライセンス キーを使用すると、完全なマシン ライセンスが存在しない場合に、アプリケーションでオブジェクトをインスタント化できます。
通常、ATL オブジェクトは、クラス ファクトリを CComCoClass から派生させて取得します。 このクラスには、CComClassFactory を既定のクラス ファクトリとして宣言する DECLARE_CLASSFACTORY マクロが含まれます。 CComClassFactory2
を使用するには、オブジェクトのクラス定義で DECLARE_CLASSFACTORY2 マクロを指定します。 次に例を示します。
class ATL_NO_VTABLE CMyClass2 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyClass2, &CLSID_MyClass>,
public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
DECLARE_CLASSFACTORY2(CMyLicense)
// Remainder of class declaration omitted
CMyLicense
(CComClassFactory2
へのテンプレート パラメーター) は、静的関数 VerifyLicenseKey
、GetLicenseKey
、IsLicenseValid
を実装する必要があります。 簡単なライセンス クラスの例を次に示します。
class CMyLicense
{
protected:
static BOOL VerifyLicenseKey(BSTR bstr)
{
USES_CONVERSION;
return !lstrcmp(OLE2T(bstr), _T("My run-time license key"));
}
static BOOL GetLicenseKey(DWORD /*dwReserved*/, BSTR* pBstr)
{
USES_CONVERSION;
*pBstr = SysAllocString( T2OLE(_T("My run-time license key")));
return TRUE;
}
static BOOL IsLicenseValid() { return TRUE; }
};
CComClassFactory2
は、CComClassFactory2Base
とライセンスの両方から派生します。 次に、CComClassFactory2Base
は、IClassFactory2
と CComObjectRootEx< CComGlobalsThreadModel> から派生します。
DECLARE_CLASSFACTORY_AUTO_THREAD
CComClassFactoryAutoThread がクラス ファクトリであることを宣言します。
DECLARE_CLASSFACTORY_AUTO_THREAD()
解説
CComCoClass には、CComClassFactory を既定のクラス ファクトリとして指定する DECLARE_CLASSFACTORY マクロが含まれます。 ただし、オブジェクトのクラス定義に DECLARE_CLASSFACTORY_AUTO_THREAD マクロを含めることにより、この既定値をオーバーライドできます。
オブジェクトを複数のアパートメント (アウト プロセス サーバー) に作成する場合は、DECLARE_CLASSFACTORY_AUTO_THREAD をクラスに追加します。
例
class ATL_NO_VTABLE CMyAutoClass :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
public IMyAutoClass
{
public:
DECLARE_CLASSFACTORY_AUTO_THREAD()
// Remainder of class declaration omitted.
CComClassFactoryAutoThread Class
このクラスを使用すると、IClassFactory インターフェイスが実装され、オブジェクトを複数のアパートメントに作成することができます。
重要
このクラスとそのメンバーは、Windows ランタイムで実行するアプリケーションで使用することはできません。
class CComClassFactoryAutoThread : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>
解説
CComClassFactoryAutoThread
は CComClassFactory と似ていますが、オブジェクトを複数のアパートメントに作成できます。 このサポートを利用するには、EXE モジュールを CComAutoThreadModule から派生させます。
通常、ATL オブジェクトは、クラス ファクトリを CComCoClass から派生させて取得します。 このクラスには、CComClassFactory を既定のクラス ファクトリとして宣言する DECLARE_CLASSFACTORY マクロが含まれます。 CComClassFactoryAutoThread
を使用するには、オブジェクトのクラス定義で DECLARE_CLASSFACTORY_AUTO_THREAD マクロを指定します。 次に例を示します。
class ATL_NO_VTABLE CMyAutoClass :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
public IMyAutoClass
{
public:
DECLARE_CLASSFACTORY_AUTO_THREAD()
// Remainder of class declaration omitted.
DECLARE_CLASSFACTORY_SINGLETON
CComClassFactorySingleton がクラス ファクトリであることを宣言します。
DECLARE_CLASSFACTORY_SINGLETON( obj )
パラメーター
obj
[入力] クラス オブジェクトの名前。
解説
CComCoClass には、CComClassFactory を既定のクラス ファクトリとして指定する DECLARE_CLASSFACTORY マクロが含まれます。 ただし、オブジェクトのクラス定義に DECLARE_CLASSFACTORY_SINGLETON マクロを含めることにより、この既定値をオーバーライドできます。
例
class ATL_NO_VTABLE CMySingletonClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
public IMySingletonClass
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)
// Remainder of class declaration omitted.
CComClassFactorySingleton クラス
このクラスは、CComClassFactory から派生し、CComObjectGlobal を使用して 1 つのオブジェクトを構築します。
重要
このクラスとそのメンバーは、Windows ランタイムで実行するアプリケーションで使用することはできません。
template<class T>
class CComClassFactorySingleton : public CComClassFactory
パラメーター
T
クラス。
CComClassFactorySingleton
は、CComClassFactory から派生し、CComObjectGlobal を使用して 1 つのオブジェクトを構築します。 CreateInstance
メソッドを呼び出すたびに、このオブジェクトに対してインターフェイス ポインターのクエリが実行されるだけです。
解説
通常、ATL オブジェクトは、クラス ファクトリを CComCoClass から派生させて取得します。 このクラスには、CComClassFactory
を既定のクラス ファクトリとして宣言する DECLARE_CLASSFACTORY マクロが含まれます。 CComClassFactorySingleton
を使用するには、オブジェクトのクラス定義で DECLARE_CLASSFACTORY_SINGLETON マクロを指定します。 次に例を示します。
class ATL_NO_VTABLE CMySingletonClass :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
public IMySingletonClass
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)
// Remainder of class declaration omitted.
DECLARE_GET_CONTROLLING_UNKNOWN
仮想関数 GetControllingUnknown
を宣言します。
DECLARE_GET_CONTROLLING_UNKNOWN()
解説
GetControllingUnknown
が (たとえば CComAggregateCreator
で) 未定義であることを示すコンパイラ エラー メッセージを取得する場合は、このマクロをオブジェクトに追加します。
DECLARE_NOT_AGGREGATABLE
オブジェクトを集計できないことを指定します。
DECLARE_NOT_AGGREGATABLE( x )
パラメーター
x
[入力] 集計できないとして定義するクラス オブジェクトの名前。
解説
DECLARE_NOT_AGGREGATABLE を使用すると、オブジェクトを集計しようとしたときに、CreateInstance
からエラー (CLASS_E_NOAGGREGATION) が返されます。
既定では、CComCoClass に DECLARE_AGGREGATABLE マクロが含まれます。これは、オブジェクトを集計できることを指定します。 この既定の動作をオーバーライドするには、クラス定義に DECLARE_NOT_AGGREGATABLE を含めます。
例
class ATL_NO_VTABLE CNoAggClass :
public CComObjectRoot,
public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
CNoAggClass()
{
}
DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};
DECLARE_ONLY_AGGREGATABLE
オブジェクトを集計する必要があることを指定します。
DECLARE_ONLY_AGGREGATABLE( x )
パラメーター
x
[入力] 集計可能としてのみ定義するクラス オブジェクトの名前。
解説
DECLARE_ONLY_AGGREGATABLE を使用すると、オブジェクトを集計対象外のオブジェクトとして CoCreate
を実行しようとしたときにエラー (E_FAIL) が返されます。
既定では、CComCoClass に DECLARE_AGGREGATABLE マクロが含まれます。これは、オブジェクトを集計できることを指定します。 この既定の動作をオーバーライドするには、クラス定義に DECLARE_ONLY_AGGREGATABLE を含めます。
例
class ATL_NO_VTABLE COnlyAggClass :
public CComObjectRoot,
public CComCoClass<COnlyAggClass, &CLSID_OnlyAggClass>
{
public:
COnlyAggClass()
{
}
DECLARE_ONLY_AGGREGATABLE(COnlyAggClass)
};
DECLARE_POLY_AGGREGATABLE
オブジェクトの作成時に CComPolyObject < x > のインスタンスを作成することを指定します。
DECLARE_POLY_AGGREGATABLE( x )
パラメーター
x
[入力] 集計可能または集計不可能として定義するクラス オブジェクトの名前。
解説
作成時に、外部不明の値がチェックされます。 NULL の場合は、IUnknown
が非集計オブジェクトに対して実装されます。 外部不明が NULL ではない場合は、IUnknown
が集計オブジェクトに対して実装されます。
DECLARE_POLY_AGGREGATABLE を使用する利点は、集計されるケースと集計されないケースを処理するために、CComAggObject
と CComObject
の両方をモジュールに含める必要がないことです。 1 つの CComPolyObject
オブジェクトで両方のケースが処理されます。 つまり、モジュールには、vtable の 1 つのコピーと関数の 1 つのコピーのみが存在します。 vtable が大きい場合、これにより、モジュールのサイズが大幅に縮小される可能性があります。 一方、vtable が小さい場合は、CComPolyObject
を使用すると、CComAggObject
や CComObject
のように、集計オブジェクトまたは非集計オブジェクトに合わせて最適化されないため、モジュールのサイズが若干大きくなります。
ATL コントロール ウィザードを使用して完全なコントロールを作成する場合、DECLARE_POLY_AGGREGATABLE マクロは、オブジェクト内で自動的に宣言されます。
DECLARE_PROTECT_FINAL_CONSTRUCT
(FinalConstruct で) 内部の集計されるオブジェクトによって参照カウントが増分され、カウントが 0 に減分されても、オブジェクトが削除されないように保護します。
DECLARE_PROTECT_FINAL_CONSTRUCT()
DECLARE_VIEW_STATUS
このマクロを ATL ActiveX コントロールのコントロール クラスに配置して、コンテナーに VIEWSTATUS フラグを指定します。
DECLARE_VIEW_STATUS( statusFlags )
パラメーター
statusFlags
[入力] VIEWSTATUS フラグ。 フラグの一覧については、VIEWSTATUS に関するページを参照してください。
例
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)