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_EXISTS
Unicode ).
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 CObject
odvozený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_OLECTLTYPE
toho 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 CObject
tří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 CObject
odvozenou 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 CObject
tří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 naThreadingModel=Apartment
.afxRegFreeThreading
Nastaví model threadingu v registru naThreadingModel=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
, b3
b2
, b4
b7
b5
b6
komponenty 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
, w2
a 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_OLECTLTYPE
toho 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. GetMiscStatus
OLEMISC
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_CANTLINKINSIDE
a OLEMISC_RECOMPOSEONRESIZE
.
Požadavky
Záhlaví: afxctl.h
IMPLEMENT_SERIAL
Vygeneruje kód C++ nezbytný pro dynamickou CObject
odvozenou 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_DYNCREATE
nebo 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 CCmdTarget
tří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
, b3
b2
, b4
b7
b5
b6
komponenty 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
, w2
a 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