Sdílet prostřednictvím


Služby modelu běhového objektu

Třídy CObject a CRuntimeClass zapouzdřují několik objektových služeb, včetně přístupu k informacím o třídě za běhu, serializace a vytváření dynamických objektů. Všechny třídy odvozené z CObject dědění této funkce.

Přístup k informacím o třídě za běhu umožňuje určit informace o třídě objektu za běhu. Schopnost určit třídu objektu za běhu je užitečná v případě, že potřebujete další kontrolu typů argumentů funkce a kdy je nutné napsat speciální účelový kód založený na třídě objektu. Informace o třídě runtime nejsou podporovány přímo jazykem C++.

Serializace je proces zápisu nebo čtení obsahu objektu do nebo ze souboru. Serializace můžete použít k uložení obsahu objektu i po ukončení aplikace. Objekt je pak možné načíst ze souboru při restartování aplikace. Takové datové objekty jsou označeny jako "trvalé".

Dynamické vytváření objektů umožňuje vytvořit objekt zadané třídy za běhu. Například objekty dokumentu, zobrazení a rámečku musí podporovat dynamické vytváření, protože architektura je potřebuje vytvářet dynamicky.

Následující tabulka uvádí makra MFC, která podporují informace o třídě runtime, serializaci a dynamické vytváření.

Další informace o těchto službách objektů za běhu a serializaci naleznete v článku CObject Třída: Přístup k informacím o třídě runtime.

Makra služby Runtime Object Model Services

Název Popis
DECLARE_DYNAMIC Umožňuje přístup k informacím třídy runtime (musí se použít v deklaraci třídy).
DECLARE_DYNCREATE Umožňuje dynamické vytváření a přístup k informacím třídy runtime (musí se použít v deklaraci třídy).
DECLARE_SERIAL Umožňuje serializaci a přístup k informacím třídy runtime (musí se použít v deklaraci třídy).
IMPLEMENT_DYNAMIC Umožňuje přístup k informacím o třídě za běhu (musí se použít v implementaci třídy).
IMPLEMENT_DYNCREATE Umožňuje dynamické vytváření a přístup k informacím za běhu (musí se použít v implementaci třídy).
IMPLEMENT_SERIAL Umožňuje serializaci a přístup k informacím třídy runtime (musí se použít v implementaci třídy).
RUNTIME_CLASS CRuntimeClass Vrátí strukturu, která odpovídá pojmenované třídě.

OLE často vyžaduje dynamické vytváření objektů za běhu. Například serverová aplikace OLE musí být schopna dynamicky vytvářet položky OLE v reakci na požadavek od klienta. Podobně musí být server automatizace schopný vytvářet položky v reakci na požadavky od klientů automatizace.

Knihovna tříd služby Microsoft Foundation poskytuje dvě makra specifická pro OLE.

Dynamické vytváření objektů OLE

Název Popis
AFX_COMCTL32_IF_EXISTS Určuje, zda knihovna Common Controls implementuje zadané rozhraní API.
AFX_COMCTL32_IF_EXISTS2 Určuje, zda knihovna Common Controls implementuje zadané rozhraní API.
DECLARE_OLECREATE Umožňuje vytváření objektů prostřednictvím automatizace OLE.
DECLARE_OLECTLTYPE Deklaruje GetUserTypeNameID a GetMiscStatus členské funkce vaší třídy řízení.
DECLARE_PROPPAGEIDS Deklaruje, že ovládací prvek OLE poskytuje seznam stránek vlastností pro zobrazení jeho vlastností.
IMPLEMENT_OLECREATE Umožňuje vytváření objektů systémem OLE.
IMPLEMENT_OLECTLTYPE Implementuje GetUserTypeNameID a GetMiscStatus členské funkce vaší třídy řízení.
IMPLEMENT_OLECREATE_FLAGS Toto makro nebo IMPLEMENT_OLECREATE musí být v souboru implementace pro všechny třídy, které používají DECLARE_OLECREATE.

AFX_COMCTL32_IF_EXISTS

Určuje, zda knihovna Common Controls implementuje zadané rozhraní API.

Syntaxe

AFX_COMCTL32_IF_EXISTS(  proc );

Parametry

proc
Ukazatel na řetězec ukončený hodnotou null obsahující název funkce nebo určuje pořadovou hodnotu funkce. Pokud je tento parametr pořadovou hodnotou, musí být ve slově s nízkým pořadím; slovo s vysokým pořadím musí být nula. Tento parametr musí být v kódu Unicode.

Poznámky

Pomocí tohoto makra určete, zda knihovna Společných ovládacích prvků funkci určená proc (místo volání GetProcAddress).

Požadavky

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Určuje, zda knihovna Běžných ovládacích prvků implementuje zadané rozhraní API (to je verze AFX_COMCTL32_IF_EXISTSUnicode ).

Syntaxe

AFX_COMCTL32_IF_EXISTS2( proc );

Parametry

proc
Ukazatel na řetězec ukončený hodnotou null obsahující název funkce nebo určuje pořadovou hodnotu funkce. Pokud je tento parametr pořadovou hodnotou, musí být ve slově s nízkým pořadím; slovo s vysokým pořadím musí být nula. Tento parametr musí být v kódu Unicode.

Poznámky

Pomocí tohoto makra určete, zda knihovna Společných ovládacích prvků funkci určená proc (místo volání GetProcAddress). Toto makro je verze unicode .AFX_COMCTL32_IF_EXISTS

Požadavky

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

Přidá možnost získat přístup k informacím za běhu o třídě objektu při odvození třídy z CObject.

DECLARE_DYNAMIC(class_name)

Parametry

class_name
Skutečný název třídy.

Poznámky

DECLARE_DYNAMIC Přidejte makro do modulu hlavičky (.h) pro třídu a pak tento modul zahrňte do všech .cpp modulů, které potřebují přístup k objektům této třídy.

Pokud použijete makra DECLARE_DYNAMIC a IMPLEMENT_DYNAMIC jak je popsáno, můžete pomocí RUNTIME_CLASS makra a CObject::IsKindOf funkce určit třídu objektů za běhu.

Pokud DECLARE_DYNAMIC je součástí deklarace třídy, IMPLEMENT_DYNAMIC musí být zahrnuta v implementaci třídy.

Další informace o DECLARE_DYNAMIC makrech naleznete v tématu CObject Témata předmětu.

Příklad

Podívejte se na příklad pro IMPLEMENT_DYNAMIC.

Požadavky

Záhlaví: afx.h

DECLARE_DYNCREATE

Umožňuje dynamicky vytvářet objekty CObjectodvozených tříd za běhu.

DECLARE_DYNCREATE(class_name)

Parametry

class_name
Skutečný název třídy.

Poznámky

Architektura používá tuto schopnost dynamicky vytvářet nové objekty. Například nové zobrazení vytvořené při otevření nového dokumentu. Třídy dokumentů, zobrazení a snímků by měly podporovat dynamické vytváření, protože architektura je potřebuje vytvářet dynamicky.

DECLARE_DYNCREATE Přidejte makro do .h modulu pro třídu a pak tento modul zahrňte do všech .cpp modulů, které potřebují přístup k objektům této třídy.

Pokud DECLARE_DYNCREATE je součástí deklarace třídy, IMPLEMENT_DYNCREATE musí být zahrnuta v implementaci třídy.

Další informace o DECLARE_DYNCREATE makrech naleznete v tématu CObject Témata předmětu.

Poznámka:

Makro DECLARE_DYNCREATE obsahuje všechny funkce DECLARE_DYNAMIC.

Příklad

Podívejte se na příklad pro IMPLEMENT_DYNCREATE.

Požadavky

Záhlaví: afx.h

DECLARE_OLECTLTYPE

Deklaruje GetUserTypeNameID a GetMiscStatus členské funkce vaší třídy řízení.

Syntaxe

DECLARE_OLECTLTYPE( class_name )

Parametry

class_name
Název třídy ovládacího prvku.

Poznámky

GetUserTypeNameID a GetMiscStatus jsou čistě virtuální funkce deklarované v COleControl. Vzhledem k tomu, že tyto funkce jsou čistě virtuální, musí být přepsány ve vaší třídě řízení. Kromě DECLARE_OLECTLTYPEtoho musíte makro přidat IMPLEMENT_OLECTLTYPE do deklarace třídy ovládacího prvku.

Požadavky

Záhlaví: afxctl.h

DECLARE_PROPPAGEIDS

Deklaruje, že ovládací prvek OLE poskytuje seznam stránek vlastností pro zobrazení jeho vlastností.

Syntaxe

DECLARE_PROPPAGEIDS( class_name )

Parametry

class_name
Název třídy ovládacího prvku, která vlastní stránky vlastností.

Poznámky

DECLARE_PROPPAGEIDS Použijte makro na konci deklarace třídy. Potom v .cpp souboru, který definuje členské funkce pro třídu, použijte BEGIN_PROPPAGEIDS makro, položky maker pro každou stránku vlastností ovládacího prvku a END_PROPPAGEIDS makro k deklaraci konce seznamu stránek vlastností.

Další informace o stránkách vlastností naleznete v článku Ovládací prvky ActiveX: Stránky vlastností.

Požadavky

Záhlaví: afxctl.h

DECLARE_SERIAL

Vygeneruje kód hlavičky C++ nezbytný pro -odvozenou CObjecttřídu, kterou lze serializovat.

DECLARE_SERIAL(class_name)

Parametry

class_name
Skutečný název třídy.

Poznámky

Serializace je proces zápisu nebo čtení obsahu objektu do a ze souboru.

DECLARE_SERIAL Použijte makro v .h modulu a pak tento modul zahrňte do všech .cpp modulů, které potřebují přístup k objektům této třídy.

Pokud DECLARE_SERIAL je součástí deklarace třídy, IMPLEMENT_SERIAL musí být zahrnuta v implementaci třídy.

Makro DECLARE_SERIAL obsahuje všechny funkce DECLARE_DYNAMIC a DECLARE_DYNCREATE.

Makro můžete použít AFX_API k automatickému exportu operátoru CArchive extrakce pro třídy, které používají makra DECLARE_SERIAL a IMPLEMENT_SERIAL makra. Závorky deklarací třídy (umístěné v .h souboru) s následujícím kódem:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Další informace o DECLARE_SERIAL makrech naleznete v tématu CObject Témata předmětu.

Příklad

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

   // remainder of class declaration omitted

Požadavky

Záhlaví: afx.h

IMPLEMENT_DYNAMIC

Vygeneruje kód C++ nezbytný pro dynamickou CObjectodvozenou třídu s přístupem za běhu k názvu třídy a pozici v hierarchii.

IMPLEMENT_DYNAMIC(class_name, base_class_name)

Parametry

class_name
Skutečný název třídy.

base_class_name
Název základní třídy.

Poznámky

IMPLEMENT_DYNAMIC Použijte makro v .cpp modulu a pak propojte výsledný kód objektu pouze jednou.

Další informace naleznete v tématu CObject Témata předmětu.

Příklad

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

Požadavky

Záhlaví: afx.h

IMPLEMENT_DYNCREATE

Umožňuje dynamicky vytvářet objekty odvozených CObjecttříd za běhu při použití s DECLARE_DYNCREATE makrem.

IMPLEMENT_DYNCREATE(class_name, base_class_name)

Parametry

class_name
Skutečný název třídy.

base_class_name
Skutečný název základní třídy.

Poznámky

Architektura používá tuto schopnost dynamicky vytvářet nové objekty, například při čtení objektu z disku během serializace. IMPLEMENT_DYNCREATE Přidejte makro do souboru implementace třídy. Další informace naleznete v tématu CObject Témata předmětu.

Pokud používáte makra DECLARE_DYNCREATE a IMPLEMENT_DYNCREATE makra, můžete pomocí RUNTIME_CLASS makra a CObject::IsKindOf členské funkce určit třídu objektů za běhu.

Pokud DECLARE_DYNCREATE je součástí deklarace třídy, IMPLEMENT_DYNCREATE musí být zahrnuta v implementaci třídy.

Všimněte si, že tato definice makra vyvolá výchozí konstruktor pro vaši třídu. Pokud není triviální konstruktor explicitně implementovaný třídou, musí také explicitně implementovat výchozí konstruktor. Výchozí konstruktor lze přidat do oddílů třídy private nebo protected členů, aby se zabránilo jeho zavolání z mimo implementaci třídy.

Příklad

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)

Požadavky

Záhlaví: afx.h

IMPLEMENT_OLECREATE_FLAGS

Toto makro nebo IMPLEMENT_OLECREATE musí být v souboru implementace pro všechny třídy, které používají DECLARE_OLECREATE.

Syntaxe

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

Parametry

class_name
Skutečný název třídy.

external_name
Název objektu vystavený jiným aplikacím (uzavřený v uvozovkách).

nFlags
Obsahuje jeden nebo více následujících příznaků:

  • afxRegInsertable Umožňuje, aby se ovládací prvek zobrazil v dialogovém okně Vložit objekt pro objekty OLE.
  • afxRegApartmentThreading Nastaví model threadingu v registru na ThreadingModel=Apartment.
  • afxRegFreeThreading Nastaví model threadingu v registru na ThreadingModel=Free.

Tyto dva příznaky afxRegApartmentThreading můžete zkombinovat a afxRegFreeThreading nastavit ThreadingModel=Both. Další InprocServer32 informace o registraci modelu vláken najdete v sadě Windows SDK.

l, w1, , w2, b1, b3b2, b4b7b5b6komponenty b8 CLSID třídy.

Poznámky

Poznámka:

Pokud použijete IMPLEMENT_OLECREATE_FLAGS, můžete určit, který model vláken objekt podporuje, pomocí parametru nFlags . Pokud chcete podporovat pouze model s jedním běhounem, použijte IMPLEMENT_OLECREATE.

Externí název je identifikátor vystavený jiným aplikacím. Klientské aplikace používají externí název k vyžádání objektu této třídy ze serveru automatizace.

ID třídy OLE je jedinečný 128bitový identifikátor objektu. Skládá se z jednoho long, dvou **WORD** a osmi **BYTE**s, jak je reprezentováno l, w1, w2a b1 prostřednictvím b8 v popisu syntaxe. Průvodce aplikací a průvodci kódem vytvářejí podle potřeby jedinečné ID tříd OLE.

Požadavky

Záhlaví: afxdisp.h

IMPLEMENT_OLECTLTYPE

Implementuje GetUserTypeNameID a GetMiscStatus členské funkce vaší třídy řízení.

Syntaxe

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

Parametry

class_name
Název třídy ovládacího prvku.

idsUserTypeName
ID prostředku řetězce obsahujícího externí název ovládacího prvku.

dwOleMisc
Výčet obsahující jeden nebo více příznaků. Další informace o tomto výčtu naleznete OLEMISC v sadě Windows SDK.

Poznámky

Kromě IMPLEMENT_OLECTLTYPEtoho musíte makro přidat DECLARE_OLECTLTYPE do deklarace třídy ovládacího prvku.

Členová GetUserTypeNameID funkce vrátí řetězec prostředku, který identifikuje vaši třídu ovládacího prvku. GetMiscStatusOLEMISC vrátí bity pro váš ovládací prvek. Tento výčet určuje kolekci nastavení popisujících různé vlastnosti vašeho ovládacího prvku. Úplný popis OLEMISC nastavení najdete OLEMISC v sadě Windows SDK.

Poznámka:

Výchozí nastavení používaná ovládacími prvky ActiveX ControlWizard jsou: OLEMISC_ACTIVATEWHENVISIBLE, OLEMISC_SETCLIENTSITEFIRST, OLEMISC_INSIDEOUT, OLEMISC_CANTLINKINSIDEa OLEMISC_RECOMPOSEONRESIZE.

Požadavky

Záhlaví: afxctl.h

IMPLEMENT_SERIAL

Vygeneruje kód C++ nezbytný pro dynamickou CObjectodvozenou třídu s přístupem za běhu k názvu třídy a pozici v hierarchii.

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

Parametry

class_name
Skutečný název třídy.

base_class_name
Název základní třídy.

wSchema
"Číslo verze" UINT, které bude kódováno v archivu, aby bylo možné deserializační program identifikovat a zpracovat data vytvořená dřívějšími verzemi programu. Číslo schématu třídy nesmí být -1.

Poznámky

IMPLEMENT_SERIAL Použijte makro v .cpp modulu. Výsledný kód objektu pak propojte pouze jednou.

Makro můžete použít AFX_API k automatickému exportu operátoru CArchive extrakce pro třídy, které používají makra DECLARE_SERIAL a IMPLEMENT_SERIAL makra. Závorky deklarací třídy (umístěné v .h souboru) s následujícím kódem:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Další informace najdete v tématech předmětu.CObject

Příklad

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

Požadavky

Záhlaví: afx.h

RUNTIME_CLASS

Získá run-time třídy struktury z názvu třídy C++.

RUNTIME_CLASS(class_name)

Parametry

class_name
Skutečný název třídy (není uzavřený do uvozovek).

Poznámky

RUNTIME_CLASS vrátí ukazatel na CRuntimeClass strukturu pro třídu určenou parametrem class_name. Pouze CObject-odvozené třídy deklarované pomocí DECLARE_DYNAMIC, DECLARE_DYNCREATEnebo DECLARE_SERIAL vrátí ukazatele na CRuntimeClass strukturu.

Další informace naleznete v tématu CObject Témata předmětu.

Příklad

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

Požadavky

Záhlaví: afx.h

DECLARE_OLECREATE

Umožňuje vytváření objektů odvozených CCmdTargettříd prostřednictvím automatizace OLE.

DECLARE_OLECREATE(class_name)

Parametry

class_name
Skutečný název třídy.

Poznámky

Toto makro umožňuje ostatním aplikacím s podporou OLE vytvářet objekty tohoto typu.

DECLARE_OLECREATE Přidejte makro do .h modulu pro třídu a pak tento modul zahrňte do všech .cpp modulů, které potřebují přístup k objektům této třídy.

Pokud DECLARE_OLECREATE je součástí deklarace třídy, IMPLEMENT_OLECREATE musí být zahrnuta v implementaci třídy. Deklarace třídy, která používá DECLARE_OLECREATE , musí také použít DECLARE_DYNCREATE nebo DECLARE_SERIAL.

Požadavky

Hlavička: afxdisp.h

IMPLEMENT_OLECREATE

Toto makro nebo IMPLEMENT_OLECREATE_FLAGS musí být v souboru implementace pro všechny třídy, které používají DECLARE_OLECREATE.

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

Parametry

class_name
Skutečný název třídy.

external_name
Název objektu vystavený jiným aplikacím (uzavřený v uvozovkách).

l, w1, , w2, b1, b3b2, b4b7b5b6komponenty b8 CLSID třídy.

Poznámky

Poznámka:

Pokud používáte IMPLEMENT_OLECREATE, ve výchozím nastavení podporujete pouze jeden model podprocesů. Pokud použijete IMPLEMENT_OLECREATE_FLAGS, můžete určit, který model vláken objekt podporuje, pomocí parametru nFlags .

Externí název je identifikátor vystavený jiným aplikacím. Klientské aplikace používají externí název k vyžádání objektu této třídy ze serveru automatizace.

ID třídy OLE je jedinečný 128bitový identifikátor objektu. Skládá se z jednoho long, dvou **WORD** a osmi **BYTE**s, jak je reprezentováno l, w1, w2a b1 prostřednictvím b8 v popisu syntaxe. Průvodce aplikací a průvodci kódem vytvářejí podle potřeby jedinečné ID tříd OLE.

Požadavky

Hlavička: afxdisp.h

Viz také

Makra a globální objekty
Izolace knihovny běžných ovládacích prvků MFC
Klíč CLSID