Share via


Run-Time Object Model Services

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:

  • afxRegInsertable Hiermee kan het besturingselement worden weergegeven in het dialoogvenster Object invoegen voor OLE-objecten.
  • afxRegApartmentThreading Hiermee stelt u het threadingmodel in het register in op ThreadingModel=Apartment.
  • afxRegFreeThreading Hiermee stelt u het threadingmodel in het register in op ThreadingModel=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