Bagikan melalui


Layanan Model Objek Run-Time

CObject Kelas dan CRuntimeClass merangkum beberapa layanan objek, termasuk akses ke informasi kelas run-time, serialisasi, dan pembuatan objek dinamis. Semua kelas yang berasal dari CObject mewarisi fungsionalitas ini.

Akses ke informasi kelas run-time memungkinkan Anda menentukan informasi tentang kelas objek pada waktu proses. Kemampuan untuk menentukan kelas objek pada run time berguna ketika Anda memerlukan pemeriksaan jenis argumen fungsi tambahan dan kapan Anda harus menulis kode tujuan khusus berdasarkan kelas objek. Informasi kelas run-time tidak didukung langsung oleh bahasa C++.

Serialisasi adalah proses penulisan atau pembacaan konten objek ke atau dari file. Anda dapat menggunakan serialisasi untuk menyimpan konten objek bahkan setelah aplikasi keluar. Objek kemudian dapat dibaca dari file ketika aplikasi dimulai ulang. Objek data seperti itu dikatakan "persisten."

Pembuatan objek dinamis memungkinkan Anda membuat objek kelas tertentu pada waktu proses. Misalnya, objek dokumen, tampilan, dan bingkai harus mendukung pembuatan dinamis karena kerangka kerja perlu membuatnya secara dinamis.

Tabel berikut mencantumkan makro MFC yang mendukung informasi kelas run-time, serialisasi, dan pembuatan dinamis.

Untuk informasi selengkapnya tentang layanan objek run-time dan serialisasi ini, lihat artikel CObject Kelas: Mengakses Informasi Kelas Run-Time.

Makro Layanan Model Objek Run-Time

Nama Deskripsi
DECLARE_DYNAMIC Mengaktifkan akses ke informasi kelas run-time (harus digunakan dalam deklarasi kelas).
DECLARE_DYNCREATE Memungkinkan pembuatan dan akses dinamis ke informasi kelas run-time (harus digunakan dalam deklarasi kelas).
DECLARE_SERIAL Mengaktifkan serialisasi dan akses ke informasi kelas run-time (harus digunakan dalam deklarasi kelas).
IMPLEMENT_DYNAMIC Memungkinkan akses ke informasi kelas run-time (harus digunakan dalam implementasi kelas).
IMPLEMENT_DYNCREATE Memungkinkan pembuatan dan akses dinamis ke informasi run-time (harus digunakan dalam implementasi kelas).
IMPLEMENT_SERIAL Mengizinkan serialisasi dan akses ke informasi kelas run-time (harus digunakan dalam implementasi kelas).
RUNTIME_CLASS Mengembalikan CRuntimeClass struktur yang sesuai dengan kelas bernama.

OLE sering memerlukan pembuatan objek dinamis pada waktu proses. Misalnya, aplikasi server OLE harus dapat membuat item OLE secara dinamis sebagai respons terhadap permintaan dari klien. Demikian pula, server otomatisasi harus dapat membuat item sebagai respons terhadap permintaan dari klien otomatisasi.

Pustaka Kelas Microsoft Foundation menyediakan dua makro khusus untuk OLE.

Pembuatan Dinamis Objek OLE

Nama Deskripsi
AFX_COMCTL32_IF_EXISTS Menentukan apakah pustaka Common Controls mengimplementasikan API yang ditentukan.
AFX_COMCTL32_IF_EXISTS2 Menentukan apakah pustaka Common Controls mengimplementasikan API yang ditentukan.
DECLARE_OLECREATE Memungkinkan objek dibuat melalui otomatisasi OLE.
DECLARE_OLECTLTYPE Mendeklarasikan GetUserTypeNameID fungsi anggota dan GetMiscStatus kelas kontrol Anda.
DECLARE_PROPPAGEIDS Menyatakan bahwa kontrol OLE menyediakan daftar halaman properti untuk menampilkan propertinya.
IMPLEMENT_OLECREATE Memungkinkan objek dibuat oleh sistem OLE.
IMPLEMENT_OLECTLTYPE GetUserTypeNameID Menerapkan fungsi anggota dan GetMiscStatus dari kelas kontrol Anda.
IMPLEMENT_OLECREATE_FLAGS Baik makro ini atau IMPLEMENT_OLECREATE harus muncul dalam file implementasi untuk kelas apa pun yang menggunakan DECLARE_OLECREATE.

AFX_COMCTL32_IF_EXISTS

Menentukan apakah pustaka Common Controls mengimplementasikan API yang ditentukan.

Sintaks

AFX_COMCTL32_IF_EXISTS(  proc );

Parameter

proc
Penunjuk ke string null-terminated yang berisi nama fungsi, atau menentukan nilai ordinal fungsi. Jika parameter ini adalah nilai ordinal, parameter harus dalam kata urutan rendah; kata urutan tinggi harus nol. Parameter ini harus berada di Unicode.

Keterangan

Gunakan makro ini untuk menentukan apakah pustaka Common Controls fungsi yang ditentukan oleh proc (alih-alih memanggil GetProcAddress.

Persyaratan

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Menentukan apakah pustaka Common Controls mengimplementasikan API yang ditentukan (ini adalah versi AFX_COMCTL32_IF_EXISTSUnicode ).

Sintaks

AFX_COMCTL32_IF_EXISTS2( proc );

Parameter

proc
Penunjuk ke string null-terminated yang berisi nama fungsi, atau menentukan nilai ordinal fungsi. Jika parameter ini adalah nilai ordinal, parameter harus dalam kata urutan rendah; kata urutan tinggi harus nol. Parameter ini harus berada di Unicode.

Keterangan

Gunakan makro ini untuk menentukan apakah pustaka Common Controls fungsi yang ditentukan oleh proc (alih-alih memanggil GetProcAddress. Makro ini adalah versi Unicode dari AFX_COMCTL32_IF_EXISTS.

Persyaratan

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

Menambahkan kemampuan untuk mengakses informasi run-time tentang kelas objek saat mendapatkan kelas dari CObject.

DECLARE_DYNAMIC(class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

Keterangan

DECLARE_DYNAMIC Tambahkan makro ke modul header (.h) untuk kelas , lalu sertakan modul tersebut di semua .cpp modul yang memerlukan akses ke objek kelas ini.

Jika Anda menggunakan DECLARE_DYNAMIC makro dan IMPLEMENT_DYNAMIC seperti yang dijelaskan, Anda kemudian dapat menggunakan RUNTIME_CLASS makro dan CObject::IsKindOf fungsi untuk menentukan kelas objek Anda pada waktu proses.

Jika DECLARE_DYNAMIC disertakan dalam deklarasi kelas, maka IMPLEMENT_DYNAMIC harus disertakan dalam implementasi kelas.

Untuk informasi selengkapnya tentang DECLARE_DYNAMIC makro, lihat CObject Topik Kelas.

Contoh

Lihat contoh untuk IMPLEMENT_DYNAMIC.

Persyaratan

Header: afx.h

DECLARE_DYNCREATE

Memungkinkan objek kelas CObject-turunan dibuat secara dinamis pada waktu proses.

DECLARE_DYNCREATE(class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

Keterangan

Kerangka kerja menggunakan kemampuan ini untuk membuat objek baru secara dinamis. Misalnya, tampilan baru dibuat saat Anda membuka dokumen baru. Kelas dokumen, tampilan, dan bingkai harus mendukung pembuatan dinamis karena kerangka kerja perlu membuatnya secara dinamis.

DECLARE_DYNCREATE Tambahkan makro dalam .h modul untuk kelas, lalu sertakan modul tersebut di semua .cpp modul yang memerlukan akses ke objek kelas ini.

Jika DECLARE_DYNCREATE disertakan dalam deklarasi kelas, maka IMPLEMENT_DYNCREATE harus disertakan dalam implementasi kelas.

Untuk informasi selengkapnya tentang DECLARE_DYNCREATE makro, lihat CObject Topik Kelas.

Catatan

DECLARE_DYNCREATE Makro mencakup semua fungsionalitas DECLARE_DYNAMIC.

Contoh

Lihat contoh untuk IMPLEMENT_DYNCREATE.

Persyaratan

Header: afx.h

DECLARE_OLECTLTYPE

Mendeklarasikan GetUserTypeNameID fungsi anggota dan GetMiscStatus kelas kontrol Anda.

Sintaks

DECLARE_OLECTLTYPE( class_name )

Parameter

class_name
Nama kelas kontrol.

Keterangan

GetUserTypeNameID dan GetMiscStatus merupakan fungsi virtual murni, dinyatakan dalam COleControl. Karena fungsi-fungsi ini murni virtual, fungsi tersebut harus ditimpa di kelas kontrol Anda. Selain DECLARE_OLECTLTYPE, Anda harus menambahkan makro ke IMPLEMENT_OLECTLTYPE deklarasi kelas kontrol Anda.

Persyaratan

Header: afxctl.h

DECLARE_PROPPAGEIDS

Menyatakan bahwa kontrol OLE menyediakan daftar halaman properti untuk menampilkan propertinya.

Sintaks

DECLARE_PROPPAGEIDS( class_name )

Parameter

class_name
Nama kelas kontrol yang memiliki halaman properti.

Keterangan

DECLARE_PROPPAGEIDS Gunakan makro di akhir deklarasi kelas Anda. Kemudian, dalam .cpp file yang menentukan fungsi anggota untuk kelas, gunakan BEGIN_PROPPAGEIDS makro, entri makro untuk setiap halaman properti kontrol Anda, dan END_PROPPAGEIDS makro untuk mendeklarasikan akhir daftar halaman properti.

Untuk informasi selengkapnya tentang halaman properti, lihat artikel Kontrol ActiveX: Halaman Properti.

Persyaratan

Header: afxctl.h

DECLARE_SERIAL

Menghasilkan kode header C++ yang CObjectdiperlukan untuk kelas -turunan yang dapat diserialisasikan.

DECLARE_SERIAL(class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

Keterangan

Serialisasi adalah proses penulisan atau pembacaan konten objek ke dan dari file.

Gunakan makro dalam .h modul, lalu sertakan modul tersebut DECLARE_SERIAL di semua .cpp modul yang memerlukan akses ke objek kelas ini.

Jika DECLARE_SERIAL disertakan dalam deklarasi kelas, maka IMPLEMENT_SERIAL harus disertakan dalam implementasi kelas.

DECLARE_SERIAL Makro mencakup semua fungsionalitas DECLARE_DYNAMIC dan DECLARE_DYNCREATE.

Anda dapat menggunakan AFX_API makro untuk mengekspor CArchive operator ekstraksi secara otomatis untuk kelas yang menggunakan DECLARE_SERIAL makro dan IMPLEMENT_SERIAL . Kurung siku deklarasi kelas (terletak di .h file) dengan kode berikut:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Untuk informasi selengkapnya tentang DECLARE_SERIAL makro, lihat CObject Topik Kelas.

Contoh

class CAge : public CObject
{
public:
   void Serialize(CArchive& ar);
   DECLARE_SERIAL(CAge)

   // remainder of class declaration omitted

Persyaratan

Header: afx.h

IMPLEMENT_DYNAMIC

Menghasilkan kode C++ yang diperlukan untuk kelas dinamis CObject-turunan dengan akses run-time ke nama kelas dan posisi dalam hierarki.

IMPLEMENT_DYNAMIC(class_name, base_class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

base_class_name
Nama kelas dasar.

Keterangan

IMPLEMENT_DYNAMIC Gunakan makro dalam .cpp modul, lalu tautkan kode objek yang dihasilkan hanya sekali.

Untuk informasi selengkapnya, lihat CObject Topik Kelas.

Contoh

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

Persyaratan

Header: afx.h

IMPLEMENT_DYNCREATE

Memungkinkan objek kelas CObject-turunan dibuat secara dinamis pada waktu proses saat digunakan dengan DECLARE_DYNCREATE makro.

IMPLEMENT_DYNCREATE(class_name, base_class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

base_class_name
Nama aktual kelas dasar.

Keterangan

Kerangka kerja menggunakan kemampuan ini untuk membuat objek baru secara dinamis, misalnya, ketika membaca objek dari disk selama serialisasi. IMPLEMENT_DYNCREATE Tambahkan makro dalam file implementasi kelas. Untuk informasi selengkapnya, lihat CObject Topik Kelas.

Jika Anda menggunakan DECLARE_DYNCREATE makro dan IMPLEMENT_DYNCREATE , Anda kemudian dapat menggunakan RUNTIME_CLASS makro dan CObject::IsKindOf fungsi anggota untuk menentukan kelas objek Anda pada waktu proses.

Jika DECLARE_DYNCREATE disertakan dalam deklarasi kelas, maka IMPLEMENT_DYNCREATE harus disertakan dalam implementasi kelas.

Perhatikan bahwa definisi makro ini akan memanggil konstruktor default untuk kelas Anda. Jika konstruktor non-sepele diimplementasikan secara eksplisit oleh kelas , konstruktor default juga harus secara eksplisit menerapkan konstruktor default. Konstruktor default dapat ditambahkan ke bagian kelas private atau protected anggota untuk mencegahnya dipanggil dari luar implementasi kelas.

Contoh

class CMyDynCreateObj : public CObject
{
   int m_Num;
public:
   DECLARE_DYNCREATE(CMyDynCreateObj)
   CMyDynCreateObj(int Num) { m_Num = Num; }
private:
   CMyDynCreateObj() { m_Num = 0; }  // provide default constructor only for 
                                     // dynamic creation 
};

 

IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)

Persyaratan

Header: afx.h

IMPLEMENT_OLECREATE_FLAGS

Baik makro ini atau IMPLEMENT_OLECREATE harus muncul dalam file implementasi untuk kelas apa pun yang menggunakan DECLARE_OLECREATE.

Sintaks

IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
    l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

Parameter

class_name
Nama kelas yang sebenarnya.

external_name
Nama objek yang diekspos ke aplikasi lain (diapit dalam tanda kutip).

nFlags
Berisi satu atau beberapa bendera berikut:

  • afxRegInsertable Memungkinkan kontrol muncul dalam kotak dialog Sisipkan Objek untuk objek OLE.
  • afxRegApartmentThreading Mengatur model utas dalam registri ke ThreadingModel=Apartment.
  • afxRegFreeThreading Mengatur model utas dalam registri ke ThreadingModel=Free.

Anda dapat menggabungkan dua bendera afxRegApartmentThreading dan afxRegFreeThreading untuk mengatur ThreadingModel=Both. Lihat InprocServer32 di Windows SDK untuk informasi selengkapnya tentang pendaftaran model utas.

l, , w1, b1w2, b2, b3, b4b5, , b6, b7, , b8 Komponen CLSID kelas.

Keterangan

Catatan

Jika Anda menggunakan IMPLEMENT_OLECREATE_FLAGS, Anda dapat menentukan model utas mana yang didukung objek Anda dengan menggunakan nFlags parameter . Jika Anda hanya ingin mendukung model single-treading, gunakan IMPLEMENT_OLECREATE.

Nama eksternal adalah pengidentifikasi yang terekspos ke aplikasi lain. Aplikasi klien menggunakan nama eksternal untuk meminta objek kelas ini dari server otomatisasi.

ID kelas OLE adalah pengidentifikasi 128-bit unik untuk objek tersebut. Ini terdiri dari satu long, dua **WORD**s, dan delapan **BYTE**s, seperti yang diwakili oleh l, , w1w2, dan b1 melalui b8 dalam deskripsi sintaks. Wizard Aplikasi dan wizard kode membuat ID kelas OLE unik untuk Anda sesuai kebutuhan.

Persyaratan

Header: afxdisp.h

IMPLEMENT_OLECTLTYPE

GetUserTypeNameID Menerapkan fungsi anggota dan GetMiscStatus dari kelas kontrol Anda.

Sintaks

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

Parameter

class_name
Nama kelas kontrol.

idsUserTypeName
ID sumber daya string yang berisi nama eksternal kontrol.

dwOleMisc
Enumerasi yang berisi satu atau beberapa bendera. Untuk informasi selengkapnya tentang enumerasi ini, lihat OLEMISC di Windows SDK.

Keterangan

Selain IMPLEMENT_OLECTLTYPE, Anda harus menambahkan makro ke DECLARE_OLECTLTYPE deklarasi kelas kontrol Anda.

Fungsi GetUserTypeNameID anggota mengembalikan string sumber daya yang mengidentifikasi kelas kontrol Anda. GetMiscStatusOLEMISC mengembalikan bit untuk kontrol Anda. Enumerasi ini menentukan kumpulan pengaturan yang menjelaskan karakteristik kontrol Anda yang lain-lain. Untuk deskripsi lengkap pengaturan OLEMISC , lihat OLEMISC di Windows SDK.

Catatan

Pengaturan default yang digunakan oleh ActiveX ControlWizard adalah: OLEMISC_ACTIVATEWHENVISIBLE, , OLEMISC_SETCLIENTSITEFIRST, OLEMISC_INSIDEOUTOLEMISC_CANTLINKINSIDE, dan OLEMISC_RECOMPOSEONRESIZE.

Persyaratan

Header: afxctl.h

IMPLEMENT_SERIAL

Menghasilkan kode C++ yang diperlukan untuk kelas dinamis CObject-turunan dengan akses run-time ke nama kelas dan posisi dalam hierarki.

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

Parameter

class_name
Nama kelas yang sebenarnya.

base_class_name
Nama kelas dasar.

wSchema
"Nomor versi" UINT yang akan dikodekan dalam arsip untuk memungkinkan program deserialisasi mengidentifikasi dan menangani data yang dibuat oleh versi program sebelumnya. Nomor skema kelas tidak boleh -1.

Keterangan

IMPLEMENT_SERIAL Gunakan makro dalam .cpp modul; lalu tautkan kode objek yang dihasilkan hanya sekali.

Anda dapat menggunakan AFX_API makro untuk mengekspor CArchive operator ekstraksi secara otomatis untuk kelas yang menggunakan DECLARE_SERIAL makro dan IMPLEMENT_SERIAL . Kurung siku deklarasi kelas (terletak di .h file) dengan kode berikut:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Untuk informasi selengkapnya, lihat CObject Topik Kelas.

Contoh

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

Persyaratan

Header: afx.h

RUNTIME_CLASS

Mendapatkan struktur kelas run-time dari nama kelas C++.

RUNTIME_CLASS(class_name)

Parameter

class_name
Nama aktual kelas (tidak diapit dalam tanda kutip).

Keterangan

RUNTIME_CLASS mengembalikan penunjuk ke CRuntimeClass struktur untuk kelas yang ditentukan oleh class_name. Hanya CObjectkelas turunan yang dideklarasikan dengan DECLARE_DYNAMIC, , DECLARE_DYNCREATEatau DECLARE_SERIAL akan mengembalikan penunjuk ke CRuntimeClass struktur.

Untuk informasi selengkapnya, lihat CObject Topik Kelas.

Contoh

CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

Persyaratan

Header: afx.h

DECLARE_OLECREATE

Memungkinkan objek kelas CCmdTarget-turunan dibuat melalui otomatisasi OLE.

DECLARE_OLECREATE(class_name)

Parameter

class_name
Nama kelas yang sebenarnya.

Keterangan

Makro ini memungkinkan aplikasi berkemampuan OLE lainnya untuk membuat objek jenis ini.

DECLARE_OLECREATE Tambahkan makro dalam .h modul untuk kelas , lalu sertakan modul tersebut di semua .cpp modul yang memerlukan akses ke objek kelas ini.

Jika DECLARE_OLECREATE disertakan dalam deklarasi kelas, maka IMPLEMENT_OLECREATE harus disertakan dalam implementasi kelas. Deklarasi kelas menggunakan DECLARE_OLECREATE juga harus menggunakan DECLARE_DYNCREATE atau DECLARE_SERIAL.

Persyaratan

Header: afxdisp.h

IMPLEMENT_OLECREATE

Baik makro ini atau IMPLEMENT_OLECREATE_FLAGS harus muncul dalam file implementasi untuk kelas apa pun yang menggunakan DECLARE_OLECREATE.

IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

Parameter

class_name
Nama kelas yang sebenarnya.

external_name
Nama objek yang diekspos ke aplikasi lain (diapit dalam tanda kutip).

l, , w1, b1w2, b2, b3, b4b5, , b6, b7, , b8 Komponen CLSID kelas.

Keterangan

Catatan

Jika Anda menggunakan IMPLEMENT_OLECREATE, secara default, Anda hanya mendukung model utas tunggal. Jika Anda menggunakan IMPLEMENT_OLECREATE_FLAGS, Anda dapat menentukan model utas mana yang didukung objek Anda dengan menggunakan nFlags parameter .

Nama eksternal adalah pengidentifikasi yang terekspos ke aplikasi lain. Aplikasi klien menggunakan nama eksternal untuk meminta objek kelas ini dari server otomatisasi.

ID kelas OLE adalah pengidentifikasi 128-bit unik untuk objek tersebut. Ini terdiri dari satu long, dua **WORD**s, dan delapan **BYTE**s, seperti yang diwakili oleh l, , w1w2, dan b1 melalui b8 dalam deskripsi sintaks. Wizard Aplikasi dan wizard kode membuat ID kelas OLE unik untuk Anda sesuai kebutuhan.

Persyaratan

Header: afxdisp.h

Lihat juga

Makro dan Global
Isolasi Pustaka Kontrol Umum MFC
Kunci CLSID