建議使用 Visual Studio 2017

執行階段物件模型服務

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

類別CObjectCRuntimeClass封裝數個物件服務,包括存取執行階段類別資訊、 序列化和動態物件建立。 從 CObject 衍生的所有類別都會繼承此功能。

對執行階段類別資訊的存取可讓您決定在執行階段的物件類別相關資訊。 當您需要進行函式引數的額外類別檢查時,以及當您必須根據物件類別撰寫特殊用途的程式碼時,能夠在執行階段決定物件的類別就很有用。 C++ 語言並不直接支援執行階段類別資訊。

序列化是對於檔案來回寫入或讀取物件內容的程序。 即使應用程式結束之後,您還是可以使用序列化儲存物件的內容。 當應用程式重新啟動時,您可以從檔案讀取物件。 這類資料物件稱為「持續性」。

動態物件建立可讓您在執行階段建立指定類別的物件。 例如,因為架構需要動態建立文件、檢視和框架物件,所以必須支援動態建立。

下表列出支援的執行階段類別資訊、序列化和動態建立的 MFC 巨集。

如需有關這些執行階段物件服務和序列化的詳細資訊,請參閱文章CObject 類別︰ 存取執行階段類別資訊

執行階段物件模型服務巨集

DECLARE_DYNAMIC啟用對於執行階段類別資訊的存取 (必須在類別宣告中使用)。
DECLARE_DYNCREATE啟用動態建立和存取執行階段類別資訊 (必須在類別宣告中使用)。
DECLARE_SERIAL啟用序列化和存取執行階段類別資訊 (必須在類別宣告中使用)。
您的類別啟用對執行階段類別資訊的存取 (必須在類別實作中使用)。
IMPLEMENT_DYNCREATE啟用動態建立和存取執行階段資訊 (必須在類別實作中使用)。
IMPLEMENT_SERIAL允許序列化和存取執行階段類別資訊 (必須在類別實作中使用)。
RUNTIME_CLASS傳回對應至已命名類別的 CRuntimeClass 結構。

OLE 經常需要在執行階段動態建立物件。 例如,OLE 伺服器應用程式必須能夠動態建立 OLE 項目以回應來自用戶端的要求。 同樣地,Automation 伺服器必須能夠建立項目以回應從 Automation 用戶端的要求。

MFC 程式庫提供 OLE 兩個特定巨集。

動態建立 OLE 物件

DECLARE_OLECREATE讓物件透過 OLE Automation 建立。
IMPLEMENT_OLECREATE讓物件經由 OLE 系統建立。

加入衍生的類別時,存取的物件類別的執行階段資訊的能力CObject

DECLARE_DYNAMIC(class_name) 

參數

class_name
類別的實際名稱。

備註

新增DECLARE_DYNAMIC巨集類別的標頭 (.h) 模組,然後將該模組包含在所有.cpp 模組需要存取此類別的物件。

如果您使用DECLARE_動態IMPLEMENT_DYNAMIC巨集所述,您可以使用RUNTIME_CLASS巨集和CObject::IsKindOf函式可在執行階段決定物件的類別。

如果DECLARE_DYNAMIC包含在類別宣告,然後IMPLEMENT_DYNAMIC必須包含在類別實作。

如需有關DECLARE_DYNAMIC巨集,請參閱CObject 類別主題

範例

請參閱範例IMPLEMENT_DYNAMIC

可讓物件的CObject-衍生類別能夠在執行階段動態建立。

DECLARE_DYNCREATE(class_name)   

參數

class_name
類別的實際名稱。

備註

架構會使用這項功能以動態方式建立新的物件。 例如,新建立的檢視當您開啟新文件。 文件、 檢視和框架類別應該支援動態建立,因為架構需要動態地建立。

新增DECLARE_DYNCREATE類別的.h 模組中的巨集則包含該模組中所有.cpp 模組需要存取此類別的物件。

如果DECLARE_DYNCREATE包含在類別宣告,然後IMPLEMENT_DYNCREATE必須包含在類別實作。

如需有關DECLARE_DYNCREATE巨集,請參閱CObject 類別主題

System_CAPS_ICON_note.jpg 注意

DECLARE_DYNCREATE巨集包含的所有功能DECLARE_DYNAMIC

範例

請參閱範例IMPLEMENT_DYNCREATE

會產生所需的 c + + 標頭碼CObject-衍生可序列化的類別。

DECLARE_SERIAL(class_name)   

參數

class_name
類別的實際名稱。

備註

序列化是檔案中寫入或讀取物件與內容的程序。

使用DECLARE_SERIAL巨集在.h 模組中,然後將該模組包含在所有.cpp 模組需要存取此類別的物件。

如果DECLARE_SERIAL包含在類別宣告,然後IMPLEMENT_SERIAL必須包含在類別實作。

DECLARE_SERIAL巨集包含的所有功能DECLARE_DYNAMICDECLARE_DYNCREATE

您可以使用AFX_API巨集,以自動匯出CArchive引出運算子的類別使用DECLARE_SERIALIMPLEMENT_SERIAL巨集。 括號的類別宣告 (位於.h 檔) 為下列程式碼︰

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

如需有關DECLARE_SERIAL巨集,請參閱CObject 類別主題

範例

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

    // remainder of class declaration omitted

產生的 c + + 程式碼所需的動態CObject-衍生類別的執行階段存取的類別名稱和階層內的位置。

IMPLEMENT_DYNAMIC(class_name, base_class_name)  

參數

class_name
類別的實際名稱。

base_class_name
基底類別的名稱。

備註

使用IMPLEMENT_DYNAMIC.cpp 模組,並連結產生的物件一次程式碼中的巨集。

如需詳細資訊,請參閱CObject 類別主題

範例

class CPerson : public CObject 
{
   DECLARE_DYNAMIC( CPerson )

   // other declarations
};

IMPLEMENT_DYNAMIC( CPerson, CObject )

可讓物件的CObject-衍生類別能夠以動態方式建立在執行時使用的時間DECLARE_DYNCREATE巨集。

IMPLEMENT_DYNCREATE(class_name, base_class_name)   

參數

class_name
類別的實際名稱。

base_class_name
基底類別的實際名稱。

備註

架構會建立新的物件,以動態方式,例如當它從磁碟讀取物件在序列化期間使用這項功能。 新增IMPLEMENT_DYNCREATE類別實作檔中的巨集。 如需詳細資訊,請參閱CObject 類別主題

如果您使用DECLARE_DYNCREATEIMPLEMENT_DYNCREATE巨集,然後您可以使用RUNTIME_CLASS巨集和CObject::IsKindOf在執行階段判斷物件的類別成員函式。

如果DECLARE_DYNCREATE包含在類別宣告,然後IMPLEMENT_DYNCREATE必須包含在類別實作。

請注意,此巨集定義會叫用類別的預設建構函式。 如果非一般建構函式會明確實作的類別,就必須明確地實作預設建構函式以及。 預設建構函式可以加入至類別的私用保護成員區段,以防止從呼叫外部類別實作。

範例

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)

產生的 c + + 程式碼所需的動態CObject-衍生類別的執行階段存取的類別名稱和階層內的位置。

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)  

參數

class_name
類別的實際名稱。

base_class_name
基底類別的名稱。

wSchema
A UINT 」 版本號碼"會讓還原序列化程式來識別及處理所建立的資料保存在編碼之前程式版本。 類別結構描述編號不能為 â €"1。

備註

使用IMPLEMENT_SERIAL巨集在.cpp 模組,然後一次連結產生的物件程式碼。

您可以使用AFX_API巨集,以自動匯出CArchive引出運算子的類別使用DECLARE_SERIALIMPLEMENT_SERIAL巨集。 括號的類別宣告 (位於.h 檔) 為下列程式碼︰

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

如需詳細資訊,請參閱CObject 類別主題

範例

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

取得執行階段類別結構的 c + + 類別名稱。

RUNTIME_CLASS(class_name)  

參數

class_name
(不以引號括住) 類別的實際名稱。

備註

RUNTIME_CLASS傳回的指標CRuntimeClass所指定的類別結構class_name。 只有CObject-衍生的類別宣告為具有DECLARE_DYNAMICDECLARE_DYNCREATE,或DECLARE_SERIAL會傳回指標CRuntimeClass結構。

如需詳細資訊,請參閱CObject 類別主題

範例

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

可讓物件的CCmdTarget-衍生類別能夠透過 OLE automation 建立。

DECLARE_OLECREATE(class_name) 

參數

class_name
類別的實際名稱。

備註

這個巨集可讓其他 OLE 功能的應用程式建立此類型的物件。

新增DECLARE_OLECREATE類別的.h 模組中的巨集,然後包含該模組中所有.cpp 模組需要存取此類別的物件。

如果DECLARE_OLECREATE包含在類別宣告,然後IMPLEMENT_OLECREATE必須包含在類別實作。 使用類別宣告DECLARE_OLECREATE也必須使用DECLARE_DYNCREATEDECLARE_SERIAL

這個巨集或IMPLEMENT_OLECREATE_FLAGS必須出現在使用任何類別實作檔DECLARE_OLECREATE

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

參數

class_name
類別的實際名稱。

external_name
物件名稱公開給其他應用程式 (以引號括住)。

l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8
此類別的元件CLSID

備註

System_CAPS_ICON_note.jpg 注意

如果您使用IMPLEMENT_OLECREATE,您可以根據預設,支援只有單一執行緒模型。 如果您使用IMPLEMENT_OLECREATE_FLAGS,您可以指定物件支援使用哪一個執行緒模型nFlags參數。

外部名稱是公開給其他應用程式的識別碼。 用戶端應用程式使用的外部名稱從自動化伺服器要求此類別的物件。

OLE 類別 ID 是唯一的 128 位元識別碼的物件。 它包括一個、 兩個WORDs 和八位元組s 所表示的lw1w2,和b1透過b8語法描述中。 應用程式精靈和程式碼精靈視需要為您建立唯一的 OLE 類別 Id。

巨集和全域變數

顯示: