Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Opmerking
De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.
De klassen CObject en CRuntimeClass kapselen verschillende objectservices in, waaronder toegang tot runtimeklassegegevens, serialisatie en het maken van dynamische objecten. Alle klassen die zijn afgeleid van CObject deze functionaliteit nemen over.
Toegang tot runtimeklassegegevens stelt u in staat om informatie over de klasse van een object tijdens runtime te bepalen. De mogelijkheid om de klasse van een object tijdens runtime te bepalen is handig wanneer u extra typecontrole van functieargumenten nodig hebt en wanneer u speciale code moet schrijven op basis van de klasse van een object. Runtimeklassegegevens worden niet rechtstreeks ondersteund door de C++-taal.
Serialisatie is het schrijven of lezen van de inhoud van een object naar of van een bestand. U kunt serialisatie gebruiken om de inhoud van een object op te slaan, zelfs nadat de toepassing is afgesloten. Het object kan vervolgens worden gelezen uit het bestand wanneer de toepassing opnieuw wordt opgestart. Dergelijke gegevensobjecten worden 'persistent' genoemd.
Met dynamisch maken van objecten kunt u tijdens runtime een object van een opgegeven klasse maken. Document-, weergave- en frameobjecten moeten bijvoorbeeld dynamische creatie ondersteunen omdat het framework ze dynamisch moet maken.
De volgende tabel bevat de MFC-macro's die ondersteuning bieden voor runtimeklasse-informatie, serialisatie en dynamisch maken.
Zie het artikel CObject Klasse: Toegang tot Run-Time Klasse-informatie voor meer informatie over deze runtime-objectservices en -serialisatie.
Run-Time Object Model Services-macro's
| Naam | Description |
|---|---|
DECLARE_DYNAMIC |
Hiermee kunt u toegang krijgen tot runtimeklasse-informatie (moet worden gebruikt in de klassedeclaratie). |
DECLARE_DYNCREATE |
Maakt dynamisch maken en toegang tot runtimeklasse-informatie mogelijk (moet worden gebruikt in de klassedeclaratie). |
DECLARE_SERIAL |
Hiermee kunt u serialisatie en toegang tot runtimeklasse-informatie (moet worden gebruikt in de klassedeclaratie). |
IMPLEMENT_DYNAMIC |
Hiermee kunt u toegang krijgen tot runtimeklasse-informatie (moet worden gebruikt in de klasse-implementatie). |
IMPLEMENT_DYNCREATE |
Maakt dynamisch maken en toegang tot runtime-informatie mogelijk (moet worden gebruikt in de klasse-implementatie). |
IMPLEMENT_SERIAL |
Serialisatie en toegang tot runtimeklasse-informatie toestaan (moet worden gebruikt in de klasse-implementatie). |
RUNTIME_CLASS |
Retourneert de CRuntimeClass structuur die overeenkomt met de benoemde klasse. |
OLE vereist vaak het dynamisch maken van objecten tijdens runtime. Een OLE-servertoepassing moet bijvoorbeeld OLE-items dynamisch kunnen maken als reactie op een aanvraag van een client. Op dezelfde manier moet een automatiseringsserver items kunnen maken als reactie op aanvragen van automatiseringsclients.
De Microsoft Foundation Class Library biedt twee macro's die specifiek zijn voor OLE.
Dynamisch maken van OLE-objecten
| Naam | Description |
|---|---|
AFX_COMCTL32_IF_EXISTS |
Bepaalt of de bibliotheek Algemene besturingselementen de opgegeven API implementeert. |
AFX_COMCTL32_IF_EXISTS2 |
Bepaalt of de bibliotheek Algemene besturingselementen de opgegeven API implementeert. |
DECLARE_OLECREATE |
Hiermee kunnen objecten worden gemaakt via OLE-automatisering. |
DECLARE_OLECTLTYPE |
Declareert de GetUserTypeNameID functies en GetMiscStatus leden van uw controleklasse. |
DECLARE_PROPPAGEIDS |
Declareert dat het OLE-besturingselement een lijst met eigenschappenpagina's biedt om de eigenschappen weer te geven. |
IMPLEMENT_OLECREATE |
Hiermee kunnen objecten worden gemaakt door het OLE-systeem. |
IMPLEMENT_OLECTLTYPE |
Implementeert de GetUserTypeNameID functies en GetMiscStatus leden van uw controleklasse. |
IMPLEMENT_OLECREATE_FLAGS |
Deze macro of IMPLEMENT_OLECREATE moet worden weergegeven in het implementatiebestand voor elke klasse die wordt gebruikt DECLARE_OLECREATE. |
AFX_COMCTL32_IF_EXISTS
Bepaalt of de bibliotheek Algemene besturingselementen de opgegeven API implementeert.
Syntaxis
AFX_COMCTL32_IF_EXISTS( proc );
Parameterwaarden
proc
Wijs een tekenreeks met null-beëindiging aan die de functienaam bevat of geeft de rangschikkerwaarde van de functie op. Als deze parameter een rangtelwaarde is, moet deze in het woord met lage volgorde staan; het woord in hoge volgorde moet nul zijn. Deze parameter moet in Unicode staan.
Opmerkingen
Gebruik deze macro om te bepalen of de bibliotheek Algemene besturingselementen de functie die is opgegeven door proc (in plaats van aanroepen GetProcAddress) te bepalen.
Requirements
afxcomctl32.h, afxcomctl32.inl
AFX_COMCTL32_IF_EXISTS2
Bepaalt of de bibliotheek Algemene besturingselementen de opgegeven API implementeert (dit is de Unicode-versie van AFX_COMCTL32_IF_EXISTS).
Syntaxis
AFX_COMCTL32_IF_EXISTS2( proc );
Parameterwaarden
proc
Wijs een tekenreeks met null-beëindiging aan die de functienaam bevat of geeft de rangschikkerwaarde van de functie op. Als deze parameter een rangtelwaarde is, moet deze in het woord met lage volgorde staan; het woord in hoge volgorde moet nul zijn. Deze parameter moet in Unicode staan.
Opmerkingen
Gebruik deze macro om te bepalen of de bibliotheek Algemene besturingselementen de functie die is opgegeven door proc (in plaats van aanroepen GetProcAddress) te bepalen. Deze macro is de Unicode-versie van AFX_COMCTL32_IF_EXISTS.
Requirements
afxcomctl32.h, afxcomctl32.inl
DECLARE_DYNAMIC
Hiermee wordt de mogelijkheid toegevoegd om runtime-informatie over de klasse van een object te openen bij het afleiden van een klasse.CObject
DECLARE_DYNAMIC(class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
Opmerkingen
Voeg de DECLARE_DYNAMIC macro toe aan de koptekstmodule (.h) voor de klasse en voeg die module vervolgens toe aan alle .cpp modules die toegang nodig hebben tot objecten van deze klasse.
Als u de DECLARE_DYNAMIC en IMPLEMENT_DYNAMIC macro's zoals beschreven gebruikt, kunt u vervolgens de RUNTIME_CLASS macro en de CObject::IsKindOf functie gebruiken om de klasse van uw objecten tijdens runtime te bepalen.
Als DECLARE_DYNAMIC deze is opgenomen in de klassedeclaratie, IMPLEMENT_DYNAMIC moet deze worden opgenomen in de klasse-implementatie.
Zie CObject Klasonderwerpen voor meer informatie over de DECLARE_DYNAMIC macro.
Example
Zie het voorbeeld voor IMPLEMENT_DYNAMIC.
Requirements
Rubriek:afx.h
DECLARE_DYNCREATE
Hiermee kunnen objecten van CObjectafgeleide klassen dynamisch worden gemaakt tijdens runtime.
DECLARE_DYNCREATE(class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
Opmerkingen
Het framework maakt gebruik van deze mogelijkheid om dynamisch nieuwe objecten te maken. Bijvoorbeeld de nieuwe weergave die is gemaakt wanneer u een nieuw document opent. Document-, weergave- en frameklassen moeten dynamische creatie ondersteunen omdat het framework deze dynamisch moet maken.
Voeg de DECLARE_DYNCREATE macro toe aan de .h module voor de klasse en neem die module vervolgens op in alle .cpp modules die toegang nodig hebben tot objecten van deze klasse.
Als DECLARE_DYNCREATE deze is opgenomen in de klassedeclaratie, IMPLEMENT_DYNCREATE moet deze worden opgenomen in de klasse-implementatie.
Zie CObject Klasonderwerpen voor meer informatie over de DECLARE_DYNCREATE macro.
Opmerking
De DECLARE_DYNCREATE macro bevat alle functionaliteit van DECLARE_DYNAMIC.
Example
Zie het voorbeeld voor IMPLEMENT_DYNCREATE.
Requirements
Rubriek:afx.h
DECLARE_OLECTLTYPE
Declareert de GetUserTypeNameID functies en GetMiscStatus leden van uw controleklasse.
Syntaxis
DECLARE_OLECTLTYPE( class_name )
Parameterwaarden
class_name
De naam van de besturingselementklasse.
Opmerkingen
GetUserTypeNameID en GetMiscStatus zijn pure virtuele functies, gedeclareerd in COleControl. Omdat deze functies puur virtueel zijn, moeten ze worden overschreven in uw controleklasse. Bovendien DECLARE_OLECTLTYPEmoet u de macro toevoegen aan de declaratie van de IMPLEMENT_OLECTLTYPE besturingsklasse.
Requirements
Rubriek:afxctl.h
DECLARE_PROPPAGEIDS
Declareert dat het OLE-besturingselement een lijst met eigenschappenpagina's biedt om de eigenschappen weer te geven.
Syntaxis
DECLARE_PROPPAGEIDS( class_name )
Parameterwaarden
class_name
De naam van de besturingselementklasse die eigenaar is van de eigenschappenpagina's.
Opmerkingen
Gebruik de DECLARE_PROPPAGEIDS macro aan het einde van de klassedeclaratie. Gebruik vervolgens in het .cpp bestand dat de lidfuncties voor de klasse definieert de BEGIN_PROPPAGEIDS macro, macrovermeldingen voor elk van de eigenschappenpagina's van uw besturingselement en de END_PROPPAGEIDS macro om het einde van de eigenschappenpaginalijst te declareren.
Zie het artikel ActiveX-besturingselementen: Eigenschappenpagina's voor meer informatie over eigenschappenpagina's.
Requirements
Rubriek:afxctl.h
DECLARE_SERIAL
Hiermee genereert u de C++-headercode die nodig is voor een CObject-afgeleide klasse die kan worden geserialiseerd.
DECLARE_SERIAL(class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
Opmerkingen
Serialisatie is het schrijven of lezen van de inhoud van een object naar en van een bestand.
Gebruik de DECLARE_SERIAL macro in een .h module en neem die module vervolgens op in alle .cpp modules die toegang nodig hebben tot objecten van deze klasse.
Als DECLARE_SERIAL deze is opgenomen in de klassedeclaratie, IMPLEMENT_SERIAL moet deze worden opgenomen in de klasse-implementatie.
De DECLARE_SERIAL macro bevat alle functionaliteit van DECLARE_DYNAMIC en DECLARE_DYNCREATE.
U kunt de AFX_API macro gebruiken om de CArchive extractieoperator automatisch te exporteren voor klassen die gebruikmaken van de DECLARE_SERIAL en IMPLEMENT_SERIAL macro's. Haakje op de klassedeclaraties (in het .h bestand) met de volgende code:
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Zie CObject Klasonderwerpen voor meer informatie over de DECLARE_SERIAL macro.
Example
class CAge : public CObject
{
public:
void Serialize(CArchive& ar);
DECLARE_SERIAL(CAge)
// remainder of class declaration omitted
Requirements
Rubriek:afx.h
IMPLEMENT_DYNAMIC
Hiermee genereert u de C++-code die nodig is voor een dynamische-afgeleide CObjectklasse met runtimetoegang tot de klassenaam en -positie binnen de hiërarchie.
IMPLEMENT_DYNAMIC(class_name, base_class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
base_class_name
De naam van de basisklasse.
Opmerkingen
Gebruik de IMPLEMENT_DYNAMIC macro in een .cpp module en koppel de resulterende objectcode slechts één keer.
Zie CObject Klasonderwerpen voor meer informatie.
Example
class CPerson : public CObject
{
DECLARE_DYNAMIC(CPerson)
// other declarations
};
IMPLEMENT_DYNAMIC(CPerson, CObject)
Requirements
Rubriek:afx.h
IMPLEMENT_DYNCREATE
Hiermee kunnen objecten van CObject-afgeleide klassen dynamisch worden gemaakt tijdens runtime wanneer ze worden gebruikt met de DECLARE_DYNCREATE macro.
IMPLEMENT_DYNCREATE(class_name, base_class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
base_class_name
De werkelijke naam van de basisklasse.
Opmerkingen
Het framework maakt gebruik van deze mogelijkheid om dynamisch nieuwe objecten te maken, bijvoorbeeld wanneer het een object van schijf leest tijdens serialisatie. Voeg de IMPLEMENT_DYNCREATE macro toe aan het klasse-implementatiebestand. Zie CObject Klasonderwerpen voor meer informatie.
Als u de DECLARE_DYNCREATE macro's gebruikt IMPLEMENT_DYNCREATE , kunt u de RUNTIME_CLASS macro en de CObject::IsKindOf lidfunctie gebruiken om de klasse van uw objecten tijdens runtime te bepalen.
Als DECLARE_DYNCREATE deze is opgenomen in de klassedeclaratie, IMPLEMENT_DYNCREATE moet deze worden opgenomen in de klasse-implementatie.
Houd er rekening mee dat met deze macrodefinitie de standaardconstructor voor uw klasse wordt aangeroepen. Als een niet-triviale constructor expliciet door de klasse wordt geïmplementeerd, moet deze ook expliciet de standaardconstructor implementeren. De standaardconstructor kan worden toegevoegd aan de secties of protected leden van de klasse private om te voorkomen dat deze wordt aangeroepen buiten de klasse-implementatie.
Example
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)
Requirements
Rubriek:afx.h
IMPLEMENT_OLECREATE_FLAGS
Deze macro of IMPLEMENT_OLECREATE moet worden weergegeven in het implementatiebestand voor elke klasse die wordt gebruikt DECLARE_OLECREATE.
Syntaxis
IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
external_name
De objectnaam die zichtbaar is voor andere toepassingen (tussen aanhalingstekens).
nFlags
Bevat een of meer van de volgende vlaggen:
-
afxRegInsertableHiermee kan het besturingselement worden weergegeven in het dialoogvenster Object invoegen voor OLE-objecten. -
afxRegApartmentThreadingHiermee stelt u het threadingmodel in het register in opThreadingModel=Apartment. -
afxRegFreeThreadingHiermee stelt u het threadingmodel in het register in opThreadingModel=Free.
U kunt de twee vlaggen afxRegApartmentThreading combineren en afxRegFreeThreading ThreadingModel=Beide instellen. Zie InprocServer32 in de Windows SDK voor meer informatie over de registratie van threading-modellen.
l, , w2b1w1, , b2, b3, , b4, b5, , b8b6b7Onderdelen van de CLSID van de klasse.
Opmerkingen
Opmerking
Als u dit gebruikt IMPLEMENT_OLECREATE_FLAGS, kunt u opgeven welk threadingmodel uw object ondersteunt met behulp van de nFlags parameter. Als u alleen het model met één loopvlak wilt ondersteunen, gebruikt u IMPLEMENT_OLECREATE.
De externe naam is de id die beschikbaar is voor andere toepassingen. Clienttoepassingen gebruiken de externe naam om een object van deze klasse aan te vragen vanaf een automatiseringsserver.
De OLE-klasse-id is een unieke 128-bits id voor het object. Het bestaat uit één long, twee **WORD**s en acht **BYTE**s, zoals vertegenwoordigd door l, w1, w2en b1 door b8 in de syntaxisbeschrijving. Met de wizard Toepassing en codewizards kunt u naar behoefte unieke OLE-klasse-id's maken.
Requirements
Rubriek:afxdisp.h
IMPLEMENT_OLECTLTYPE
Implementeert de GetUserTypeNameID functies en GetMiscStatus leden van uw controleklasse.
Syntaxis
DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )
Parameterwaarden
class_name
De naam van de besturingselementklasse.
idsUserTypeName
De resource-id van een tekenreeks met de externe naam van het besturingselement.
dwOleMisc
Een opsomming met een of meer vlaggen. Zie de Windows SDK voor meer informatie over deze opsomming OLEMISC .
Opmerkingen
Bovendien IMPLEMENT_OLECTLTYPEmoet u de macro toevoegen aan de declaratie van de DECLARE_OLECTLTYPE besturingsklasse.
De GetUserTypeNameID lidfunctie retourneert de resourcereeks die uw besturingsklasse identificeert.
GetMiscStatus retourneert de OLEMISC bits voor uw besturingselement. Met deze opsomming geeft u een verzameling instellingen op die diverse kenmerken van uw besturingselement beschrijven. Zie de Windows SDK voor een volledige beschrijving van de OLEMISC instellingen OLEMISC .
Opmerking
De standaardinstellingen die worden gebruikt door de ActiveX ControlWizard zijn: OLEMISC_ACTIVATEWHENVISIBLE, OLEMISC_SETCLIENTSITEFIRST, OLEMISC_INSIDEOUT, OLEMISC_CANTLINKINSIDEen OLEMISC_RECOMPOSEONRESIZE.
Requirements
Rubriek:afxctl.h
IMPLEMENT_SERIAL
Hiermee genereert u de C++-code die nodig is voor een dynamische-afgeleide CObjectklasse met runtimetoegang tot de klassenaam en -positie binnen de hiërarchie.
IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
base_class_name
De naam van de basisklasse.
wSchema
Een UINT-versienummer dat in het archief wordt gecodeerd om een deserialiserend programma in staat te stellen gegevens te identificeren en te verwerken die zijn gemaakt met eerdere programmaversies. Het schemanummer van de klasse mag niet -1 zijn.
Opmerkingen
Gebruik de IMPLEMENT_SERIAL macro in een .cpp module en koppel de resulterende objectcode slechts één keer.
U kunt de AFX_API macro gebruiken om de CArchive extractieoperator automatisch te exporteren voor klassen die gebruikmaken van de DECLARE_SERIAL en IMPLEMENT_SERIAL macro's. Haakje op de klassedeclaraties (in het .h bestand) met de volgende code:
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Zie de CObject klasonderwerpen voor meer informatie.
Example
IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)
Requirements
Rubriek:afx.h
RUNTIME_CLASS
Haalt de runtimeklassestructuur op uit de naam van een C++-klasse.
RUNTIME_CLASS(class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse (niet tussen aanhalingstekens).
Opmerkingen
RUNTIME_CLASS retourneert een aanwijzer naar een CRuntimeClass structuur voor de klasse die is opgegeven door class_name. Alleen CObject-afgeleide klassen die zijn gedeclareerd met DECLARE_DYNAMIC, DECLARE_DYNCREATEof DECLARE_SERIAL retourneren aanwijzers naar een CRuntimeClass structuur.
Zie CObject Klasonderwerpen voor meer informatie.
Example
CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
Requirements
Rubriek:afx.h
DECLARE_OLECREATE
Hiermee kunnen objecten van CCmdTarget-afgeleide klassen worden gemaakt via OLE-automatisering.
DECLARE_OLECREATE(class_name)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
Opmerkingen
Met deze macro kunnen andere OLE-toepassingen objecten van dit type maken.
Voeg de DECLARE_OLECREATE macro toe aan de .h module voor de klasse en neem die module vervolgens op in alle .cpp modules die toegang nodig hebben tot objecten van deze klasse.
Als DECLARE_OLECREATE deze is opgenomen in de klassedeclaratie, IMPLEMENT_OLECREATE moet deze worden opgenomen in de klasse-implementatie. Een klassedeclaratie met behulp DECLARE_OLECREATE van moet ook of DECLARE_DYNCREATEDECLARE_SERIAL.
Requirements
Koptekst: afxdisp.h
IMPLEMENT_OLECREATE
Deze macro of IMPLEMENT_OLECREATE_FLAGS moet worden weergegeven in het implementatiebestand voor elke klasse die wordt gebruikt DECLARE_OLECREATE.
IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Parameterwaarden
class_name
De werkelijke naam van de klasse.
external_name
De objectnaam die zichtbaar is voor andere toepassingen (tussen aanhalingstekens).
l, , w2b1w1, , b2, b3, , b4, b5, , b8b6b7Onderdelen van de CLSID van de klasse.
Opmerkingen
Opmerking
Als u standaard gebruikt IMPLEMENT_OLECREATE, ondersteunt u alleen het model voor één threading. Als u dit gebruikt IMPLEMENT_OLECREATE_FLAGS, kunt u opgeven welk threadingmodel uw object ondersteunt met behulp van de nFlags parameter.
De externe naam is de id die beschikbaar is voor andere toepassingen. Clienttoepassingen gebruiken de externe naam om een object van deze klasse aan te vragen vanaf een automatiseringsserver.
De OLE-klasse-id is een unieke 128-bits id voor het object. Het bestaat uit één long, twee **WORD**s en acht **BYTE**s, zoals vertegenwoordigd door l, w1, w2en b1 door b8 in de syntaxisbeschrijving. Met de wizard Toepassing en codewizards kunt u naar behoefte unieke OLE-klasse-id's maken.
Requirements
Koptekst: afxdisp.h
Zie ook
macro's en globalen
Isolatie van de MFC Common Controls Library
CLSID-sleutel