Share via


集計マクロとクラス ファクトリ マクロ

以下のマクロは、集計を制御する方法と、クラス ファクトリを宣言する方法を提供します。

マクロ 説明
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_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
[入力] VerifyLicenseKeyGetLicenseKeyIsLicenseValid を実装するクラス。

解説

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 へのテンプレート パラメーター) は、静的関数 VerifyLicenseKeyGetLicenseKeyIsLicenseValid を実装する必要があります。 簡単なライセンス クラスの例を次に示します。

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 は、IClassFactory2CComObjectRootEx< 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>

解説

CComClassFactoryAutoThreadCComClassFactory と似ていますが、オブジェクトを複数のアパートメントに作成できます。 このサポートを利用するには、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) が返されます。

既定では、CComCoClassDECLARE_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) が返されます。

既定では、CComCoClassDECLARE_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 を使用する利点は、集計されるケースと集計されないケースを処理するために、CComAggObjectCComObject の両方をモジュールに含める必要がないことです。 1 つの CComPolyObject オブジェクトで両方のケースが処理されます。 つまり、モジュールには、vtable の 1 つのコピーと関数の 1 つのコピーのみが存在します。 vtable が大きい場合、これにより、モジュールのサイズが大幅に縮小される可能性があります。 一方、vtable が小さい場合は、CComPolyObject を使用すると、CComAggObjectCComObject のように、集計オブジェクトまたは非集計オブジェクトに合わせて最適化されないため、モジュールのサイズが若干大きくなります。

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)

関連項目

マクロ