Bagikan melalui


Agregasi dan Makro Pabrik Kelas

Makro ini menyediakan cara mengontrol agregasi dan mendeklarasikan pabrik kelas.

Makro Deskripsi
DECLARE_AGGREGATABLE Menyatakan bahwa objek Anda dapat diagregasi (default).
DECLARE_CLASSFACTORY Menyatakan pabrik kelas menjadi CComClassFactory, pabrik kelas default ATL.
DECLARE_CLASSFACTORY_EX Menyatakan objek pabrik kelas Anda menjadi pabrik kelas.
DECLARE_CLASSFACTORY2 Menyatakan CComClassFactory2 sebagai pabrik kelas.
DECLARE_CLASSFACTORY_AUTO_THREAD Menyatakan CComClassFactoryAutoThread sebagai pabrik kelas.
DECLARE_CLASSFACTORY_SINGLETON Menyatakan CComClassFactorySingleton sebagai pabrik kelas.
DECLARE_GET_CONTROLLING_UNKNOWN Mendeklarasikan fungsi virtual GetControllingUnknown .
DECLARE_NOT_AGGREGATABLE Menyatakan bahwa objek Anda tidak dapat diagregasi.
DECLARE_ONLY_AGGREGATABLE Menyatakan bahwa objek Anda harus diagregasi.
DECLARE_POLY_AGGREGATABLE Memeriksa nilai luar yang tidak diketahui dan menyatakan objek Anda dapat diagregasi atau tidak dapat diagregasi, sebagaimana merujuknya.
DECLARE_PROTECT_FINAL_CONSTRUCT Melindungi objek luar dari penghapusan selama konstruksi objek dalam.
DECLARE_VIEW_STATUS Menentukan bendera VIEWSTATUS ke kontainer.

Persyaratan

Header: atlcom.h

DECLARE_AGGREGATABLE

Menentukan bahwa objek Anda dapat diagregasi.

DECLARE_AGGREGATABLE( x )

Parameter

x
[di] Nama kelas yang Anda tentukan sebagai agregat.

Keterangan

CComCoClass berisi makro ini untuk menentukan model agregasi default. Untuk mengambil alih default ini, tentukan makro DECLARE_NOT_AGGREGATABLE atau DECLARE_ONLY_AGGREGATABLE dalam definisi kelas Anda.

Contoh

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_CLASSFACTORY

Menyatakan CComClassFactory sebagai pabrik kelas.

DECLARE_CLASSFACTORY()

Keterangan

CComCoClass menggunakan makro ini untuk mendeklarasikan pabrik kelas default untuk objek Anda.

Contoh

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

Kelas CComClassFactory

Kelas ini mengimplementasikan antarmuka IClassFactory .

class CComClassFactory : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

Keterangan

CComClassFactorymengimplementasikan antarmuka IClassFactory, yang berisi metode untuk membuat objek CLSID tertentu, serta mengunci pabrik kelas dalam memori untuk memungkinkan objek baru dibuat lebih cepat. IClassFactory harus diimplementasikan untuk setiap kelas yang Anda daftarkan di registri sistem dan tempat Anda menetapkan CLSID.

Objek ATL biasanya memperoleh pabrik kelas dengan berasal dari CComCoClass. Kelas ini mencakup DECLARE_CLASSFACTORY makro, yang menyatakan CComClassFactory sebagai pabrik kelas default. Untuk mengambil alih default ini, tentukan salah satu makro DECLARE_CLASSFACTORYXXX dalam definisi kelas Anda. Misalnya, makro DECLARE_CLASSFACTORY_EX menggunakan kelas yang ditentukan untuk pabrik kelas:

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.

Definisi kelas di atas menentukan yang CMyClassFactory akan digunakan sebagai pabrik kelas default objek. CMyClassFactory harus berasal dari CComClassFactory dan mengambil alih CreateInstance.

ATL menyediakan tiga makro lain yang mendeklarasikan pabrik kelas:

DECLARE_CLASSFACTORY_EX

Menyatakan cf sebagai pabrik kelas.

DECLARE_CLASSFACTORY_EX( cf )

Parameter

Cf
[di] Nama kelas yang mengimplementasikan objek pabrik kelas Anda.

Keterangan

Parameter cf harus berasal dari CComClassFactory dan mengambil alih CreateInstance metode .

CComCoClass menyertakan makro DECLARE_CLASSFACTORY , yang menentukan CComClassFactory sebagai pabrik kelas default. Namun, dengan menyertakan makro DECLARE_CLASSFACTORY_EX dalam definisi kelas objek, Anda mengambil alih default ini.

Contoh

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

Menyatakan CComClassFactory2 sebagai pabrik kelas.

DECLARE_CLASSFACTORY2( lic )

Parameter

lic
[di] Kelas yang mengimplementasikan VerifyLicenseKey, GetLicenseKey, dan IsLicenseValid.

Keterangan

CComCoClass menyertakan makro DECLARE_CLASSFACTORY , yang menentukan CComClassFactory sebagai pabrik kelas default. Namun, dengan menyertakan makro DECLARE_CLASSFACTORY2 dalam definisi kelas objek, Anda mengambil alih default ini.

Contoh

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

Kelas CComClassFactory2

Kelas ini mengimplementasikan antarmuka IClassFactory2 .

template <class license>
class  CComClassFactory2 : public IClassFactory2,
    public CComObjectRootEx<CComGlobalsThreadModel>,
    public license

Parameter

lisensi
Kelas yang mengimplementasikan fungsi statis berikut:

  • static BOOL VerifyLicenseKey( BSTR bstr );

  • static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );

  • static BOOL IsLicenseValid( );

Keterangan

CComClassFactory2mengimplementasikan antarmuka IClassFactory2, yang merupakan ekstensi dari IClassFactory. IClassFactory2 mengontrol pembuatan objek melalui lisensi. Pabrik kelas yang dijalankan pada mesin berlisensi dapat menyediakan kunci lisensi run-time. Kunci lisensi ini memungkinkan aplikasi untuk membuat instans objek ketika lisensi komputer penuh tidak ada.

Objek ATL biasanya memperoleh pabrik kelas dengan berasal dari CComCoClass. Kelas ini mencakup DECLARE_CLASSFACTORY makro, yang mendeklarasikan CComClassFactory sebagai pabrik kelas default. Untuk menggunakan CComClassFactory2, tentukan makro DECLARE_CLASSFACTORY2 dalam definisi kelas objek Anda. Contohnya:

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, parameter templat ke CComClassFactory2, harus mengimplementasikan fungsi VerifyLicenseKeystatis , , GetLicenseKeydan IsLicenseValid. Berikut ini adalah contoh kelas lisensi sederhana:

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 berasal dari dan CComClassFactory2Base lisensi. CComClassFactory2Base, pada gilirannya, berasal dari IClassFactory2 dan CComObjectRootEx< CComGlobalsThreadModel >.

DECLARE_CLASSFACTORY_AUTO_THREAD

Menyatakan CComClassFactoryAutoThread sebagai pabrik kelas.

DECLARE_CLASSFACTORY_AUTO_THREAD()

Keterangan

CComCoClass menyertakan makro DECLARE_CLASSFACTORY , yang menentukan CComClassFactory sebagai pabrik kelas default. Namun, dengan menyertakan makro DECLARE_CLASSFACTORY_AUTO_THREAD dalam definisi kelas objek, Anda mengambil alih default ini.

Saat Anda membuat objek di beberapa apartemen (di server out-of-proc), tambahkan DECLARE_CLASSFACTORY_AUTO_THREAD ke kelas Anda.

Contoh

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.

Kelas CComClassFactoryAutoThread

Kelas ini mengimplementasikan antarmuka IClassFactory , dan memungkinkan objek dibuat di beberapa apartemen.

Penting

Kelas ini dan anggotanya tidak dapat digunakan dalam aplikasi yang dijalankan di Windows Runtime.

class CComClassFactoryAutoThread : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

Keterangan

CComClassFactoryAutoThread mirip dengan CComClassFactory, tetapi memungkinkan objek dibuat di beberapa apartemen. Untuk memanfaatkan dukungan ini, dapatkan modul EXE Anda dari CComAutoThreadModule.

Objek ATL biasanya memperoleh pabrik kelas dengan berasal dari CComCoClass. Kelas ini mencakup DECLARE_CLASSFACTORY makro, yang mendeklarasikan CComClassFactory sebagai pabrik kelas default. Untuk menggunakan CComClassFactoryAutoThread, tentukan makro DECLARE_CLASSFACTORY_AUTO_THREAD dalam definisi kelas objek Anda. Contohnya:

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

Menyatakan CComClassFactorySingleton sebagai pabrik kelas.

DECLARE_CLASSFACTORY_SINGLETON( obj )

Parameter

Obj
[di] Nama objek kelas Anda.

Keterangan

CComCoClass menyertakan makro DECLARE_CLASSFACTORY , yang menentukan CComClassFactory sebagai pabrik kelas default. Namun, dengan menyertakan makro DECLARE_CLASSFACTORY_SINGLETON dalam definisi kelas objek, Anda mengambil alih default ini.

Contoh

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.

Kelas CComClassFactorySingleton

Kelas ini berasal dari CComClassFactory dan menggunakan CComObjectGlobal untuk membangun satu objek.

Penting

Kelas ini dan anggotanya tidak dapat digunakan dalam aplikasi yang dijalankan di Windows Runtime.

template<class T>
class CComClassFactorySingleton : public CComClassFactory

Parameter

T
Kelas Anda.

CComClassFactorySingleton berasal dari CComClassFactory dan menggunakan CComObjectGlobal untuk membangun satu objek. Setiap panggilan ke CreateInstance metode hanya mengkueri objek ini untuk penunjuk antarmuka.

Keterangan

Objek ATL biasanya memperoleh pabrik kelas dengan berasal dari CComCoClass. Kelas ini mencakup DECLARE_CLASSFACTORY makro, yang menyatakan CComClassFactory sebagai pabrik kelas default. Untuk menggunakan CComClassFactorySingleton, tentukan makro DECLARE_CLASSFACTORY_SINGLETON dalam definisi kelas objek Anda. Contohnya:

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

Mendeklarasikan fungsi GetControllingUnknownvirtual .

DECLARE_GET_CONTROLLING_UNKNOWN()

Keterangan

Tambahkan makro ini ke objek Anda jika Anda mendapatkan pesan kesalahan pengkompilasi yang GetControllingUnknown tidak ditentukan (misalnya, di CComAggregateCreator).

DECLARE_NOT_AGGREGATABLE

Menentukan bahwa objek Anda tidak dapat diagregasi.

DECLARE_NOT_AGGREGATABLE( x )

Parameter

x
[di] Nama objek kelas yang Anda tentukan sebagai tidak dapat diagregasi.

Keterangan

DECLARE_NOT_AGGREGATABLE menyebabkan CreateInstance kesalahan (CLASS_E_NOAGGREGATION) jika upaya dilakukan untuk mengagregasi ke objek Anda.

Secara default, CComCoClass berisi makro DECLARE_AGGREGATABLE , yang menentukan bahwa objek Anda dapat diagregasi. Untuk mengambil alih perilaku default ini, sertakan DECLARE_NOT_AGGREGATABLE dalam definisi kelas Anda.

Contoh

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_ONLY_AGGREGATABLE

Menentukan bahwa objek Anda harus diagregasi.

DECLARE_ONLY_AGGREGATABLE( x )

Parameter

x
[di] Nama objek kelas yang Anda tentukan hanya dapat diagregasi.

Keterangan

DECLARE_ONLY_AGGREGATABLE menyebabkan kesalahan (E_FAIL) jika upaya dilakukan ke CoCreate objek Anda sebagai objek nonaggregated.

Secara default, CComCoClass berisi makro DECLARE_AGGREGATABLE , yang menentukan bahwa objek Anda dapat diagregasi. Untuk mengambil alih perilaku default ini, sertakan DECLARE_ONLY_AGGREGATABLE dalam definisi kelas Anda.

Contoh

class ATL_NO_VTABLE COnlyAggClass :
   public CComObjectRoot,
   public CComCoClass<COnlyAggClass, &CLSID_OnlyAggClass>
{
public:
   COnlyAggClass()
   {
   }

   DECLARE_ONLY_AGGREGATABLE(COnlyAggClass)
};

DECLARE_POLY_AGGREGATABLE

Menentukan bahwa instans CComPolyObject < x > dibuat saat objek Anda dibuat.

DECLARE_POLY_AGGREGATABLE( x )

Parameter

x
[di] Nama objek kelas yang Anda tentukan sebagai agregat atau tidak dapat diagregasi.

Keterangan

Selama pembuatan, nilai luar yang tidak diketahui diperiksa. Jika null, IUnknown diimplementasikan untuk objek nonaggregated. Jika yang tidak diketahui luar bukan NULL, IUnknown diimplementasikan untuk objek agregat.

Keuntungan menggunakan DECLARE_POLY_AGGREGATABLE adalah Anda menghindari memiliki keduanya CComAggObject dan CComObject dalam modul Anda untuk menangani kasus agregat dan tanpa agregat. Satu CComPolyObject objek menangani kedua kasus. Ini berarti hanya satu salinan vtable dan satu salinan fungsi yang ada di modul Anda. Jika vtable Anda besar, ini dapat secara substansial mengurangi ukuran modul Anda. Namun, jika vtable Anda kecil, penggunaan CComPolyObject dapat mengakibatkan ukuran modul yang sedikit lebih besar karena tidak dioptimalkan untuk objek agregat atau nonaggregated, apa adanya CComAggObject dan CComObject.

Makro DECLARE_POLY_AGGREGATABLE secara otomatis dideklarasikan dalam objek Anda jika Anda menggunakan Wizard Kontrol ATL untuk membuat kontrol penuh.

DECLARE_PROTECT_FINAL_CONSTRUCT

Melindungi objek Anda agar tidak dihapus jika (selama FinalConstruct) objek agregat internal menaikkan jumlah referensi lalu mengurangi hitungan ke 0.

DECLARE_PROTECT_FINAL_CONSTRUCT()

DECLARE_VIEW_STATUS

Tempatkan makro ini di kelas kontrol kontrol ATL ActiveX untuk menentukan bendera VIEWSTATUS ke kontainer.

DECLARE_VIEW_STATUS( statusFlags )

Parameter

statusFlags
[di] Bendera VIEWSTATUS. Lihat VIEWSTATUS untuk daftar bendera.

Contoh

DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

Lihat juga

Macro