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
CComClassFactory
mengimplementasikan 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_CLASSFACTORY2 Menggunakan CComClassFactory2, yang mengontrol pembuatan melalui lisensi.
DECLARE_CLASSFACTORY_AUTO_THREAD Menggunakan CComClassFactoryAutoThread, yang membuat objek di beberapa apartemen.
DECLARE_CLASSFACTORY_SINGLETON Menggunakan CComClassFactorySingleton, yang membangun satu objek CComObjectGlobal.
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
CComClassFactory2
mengimplementasikan 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 VerifyLicenseKey
statis , , GetLicenseKey
dan 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 GetControllingUnknown
virtual .
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk