Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ů:
afxRegInsertableUmožňuje, aby se ovládací prvek zobrazil v dialogovém okně Vložit objekt pro objekty OLE.afxRegApartmentThreadingNastaví model threadingu v registru naThreadingModel=Apartment.afxRegFreeThreadingNastaví 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, 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