Condividi tramite


Servizi modelli a oggetti runtime

Le classi e CRuntimeClass incapsulano diversi servizi oggetti, tra cui l'accesso alle informazioni sulle classi CObject di runtime, la serializzazione e la creazione dinamica di oggetti. Tutte le classi derivate da CObject ereditano questa funzionalità.

L'accesso alle informazioni sulle classi di runtime consente di determinare informazioni sulla classe di un oggetto in fase di esecuzione. La possibilità di determinare la classe di un oggetto in fase di esecuzione è utile quando è necessario un controllo di tipo aggiuntivo degli argomenti della funzione e quando è necessario scrivere codice speciale in base alla classe di un oggetto . Le informazioni sulle classi di runtime non sono supportate direttamente dal linguaggio C++.

La serializzazione è il processo di scrittura o lettura del contenuto di un oggetto da o verso un file. È possibile usare la serializzazione per archiviare il contenuto di un oggetto anche dopo la chiusura dell'applicazione. L'oggetto può quindi essere letto dal file al riavvio dell'applicazione. Tali oggetti dati vengono considerati "persistenti".

La creazione dinamica di oggetti consente di creare un oggetto di una classe specificata in fase di esecuzione. Ad esempio, gli oggetti document, view e frame devono supportare la creazione dinamica perché il framework deve crearli in modo dinamico.

Nella tabella seguente sono elencate le macro MFC che supportano informazioni sulle classi di runtime, la serializzazione e la creazione dinamica.

Per altre informazioni su questi servizi oggetto di runtime e sulla serializzazione, vedere l'articolo CObject Classe: Accesso alle informazioni sulle classi di runtime.

Macro di Servizi modello a oggetti di run-time

Nome Descrizione
DECLARE_DYNAMIC Consente l'accesso alle informazioni sulla classe di runtime (deve essere usato nella dichiarazione di classe).
DECLARE_DYNCREATE Abilita la creazione dinamica e l'accesso alle informazioni sulle classi di runtime (devono essere usate nella dichiarazione di classe).
DECLARE_SERIAL Abilita la serializzazione e l'accesso alle informazioni sulle classi di runtime (devono essere usate nella dichiarazione di classe).
IMPLEMENT_DYNAMIC Consente l'accesso alle informazioni sulla classe di runtime (deve essere usato nell'implementazione della classe).
IMPLEMENT_DYNCREATE Abilita la creazione dinamica e l'accesso alle informazioni di runtime (devono essere usate nell'implementazione della classe).
IMPLEMENT_SERIAL Consente la serializzazione e l'accesso alle informazioni sulle classi di runtime (devono essere usate nell'implementazione della classe).
RUNTIME_CLASS Restituisce la CRuntimeClass struttura che corrisponde alla classe denominata.

OLE richiede spesso la creazione dinamica di oggetti in fase di esecuzione. Ad esempio, un'applicazione server OLE deve essere in grado di creare elementi OLE in modo dinamico in risposta a una richiesta da un client. Analogamente, un server di automazione deve essere in grado di creare elementi in risposta alle richieste provenienti dai client di automazione.

La libreria di classi Microsoft Foundation fornisce due macro specifiche di OLE.

Creazione dinamica di oggetti OLE

Nome Descrizione
AFX_COMCTL32_IF_EXISTS Determina se la libreria Common Controls implementa l'API specificata.
AFX_COMCTL32_IF_EXISTS2 Determina se la libreria Common Controls implementa l'API specificata.
DECLARE_OLECREATE Consente di creare oggetti tramite l'automazione OLE.
DECLARE_OLECTLTYPE Dichiara le GetUserTypeNameID funzioni membro e GetMiscStatus della classe di controllo.
DECLARE_PROPPAGEIDS Dichiara che il controllo OLE fornisce un elenco di pagine delle proprietà per visualizzarne le proprietà.
IMPLEMENT_OLECREATE Consente di creare oggetti dal sistema OLE.
IMPLEMENT_OLECTLTYPE Implementa le GetUserTypeNameID funzioni membro e GetMiscStatus della classe di controllo.
IMPLEMENT_OLECREATE_FLAGS Questa macro o IMPLEMENT_OLECREATE deve essere visualizzata nel file di implementazione per qualsiasi classe che usa DECLARE_OLECREATE.

AFX_COMCTL32_IF_EXISTS

Determina se la libreria Common Controls implementa l'API specificata.

Sintassi

AFX_COMCTL32_IF_EXISTS(  proc );

Parametri

proc
Puntatore a una stringa con terminazione Null contenente il nome della funzione oppure specifica il valore ordinale della funzione. Se questo parametro è un valore ordinale, deve essere nella parola in ordine basso; la parola di ordine elevato deve essere zero. Questo parametro deve essere in Unicode.

Osservazioni:

Utilizzare questa macro per determinare se la libreria Common Controls la funzione specificata da proc , anziché chiamare GetProcAddress.

Requisiti

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Determina se la libreria Common Controls implementa l'API specificata (si tratta della versione Unicode di AFX_COMCTL32_IF_EXISTS).

Sintassi

AFX_COMCTL32_IF_EXISTS2( proc );

Parametri

proc
Puntatore a una stringa con terminazione Null contenente il nome della funzione oppure specifica il valore ordinale della funzione. Se questo parametro è un valore ordinale, deve essere nella parola in ordine basso; la parola di ordine elevato deve essere zero. Questo parametro deve essere in Unicode.

Osservazioni:

Utilizzare questa macro per determinare se la libreria Common Controls la funzione specificata da proc , anziché chiamare GetProcAddress. Questa macro è la versione Unicode di AFX_COMCTL32_IF_EXISTS.

Requisiti

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

Aggiunge la possibilità di accedere alle informazioni di runtime sulla classe di un oggetto durante la derivazione di una classe da CObject.

DECLARE_DYNAMIC(class_name)

Parametri

class_name
Nome effettivo della classe.

Osservazioni:

Aggiungere la DECLARE_DYNAMIC macro al modulo di intestazione (.h) per la classe , quindi includere tale modulo in tutti i .cpp moduli che devono accedere agli oggetti di questa classe.

Se si usano le DECLARE_DYNAMIC macro e IMPLEMENT_DYNAMIC come descritto, è possibile utilizzare la RUNTIME_CLASS macro e la CObject::IsKindOf funzione per determinare la classe degli oggetti in fase di esecuzione.

Se DECLARE_DYNAMIC è incluso nella dichiarazione di classe, IMPLEMENT_DYNAMIC è necessario includere nell'implementazione della classe .

Per altre informazioni sulla DECLARE_DYNAMIC macro, vedere CObject Argomenti della classe.

Esempio

Vedere l'esempio per IMPLEMENT_DYNAMIC.

Requisiti

Intestazione: afx.h

DECLARE_DYNCREATE

Consente la creazione dinamica degli oggetti delle CObjectclassi derivate da .

DECLARE_DYNCREATE(class_name)

Parametri

class_name
Nome effettivo della classe.

Osservazioni:

Il framework usa questa possibilità per creare nuovi oggetti in modo dinamico. Ad esempio, la nuova visualizzazione creata quando si apre un nuovo documento. Le classi document, view e frame devono supportare la creazione dinamica perché il framework deve crearli in modo dinamico.

Aggiungere la DECLARE_DYNCREATE macro nel .h modulo per la classe , quindi includere tale modulo in tutti i .cpp moduli che devono accedere agli oggetti di questa classe.

Se DECLARE_DYNCREATE è incluso nella dichiarazione di classe, IMPLEMENT_DYNCREATE è necessario includere nell'implementazione della classe .

Per altre informazioni sulla DECLARE_DYNCREATE macro, vedere CObject Argomenti della classe.

Nota

La DECLARE_DYNCREATE macro include tutte le funzionalità di DECLARE_DYNAMIC.

Esempio

Vedere l'esempio per IMPLEMENT_DYNCREATE.

Requisiti

Intestazione: afx.h

DECLARE_OLECTLTYPE

Dichiara le GetUserTypeNameID funzioni membro e GetMiscStatus della classe di controllo.

Sintassi

DECLARE_OLECTLTYPE( class_name )

Parametri

class_name
Nome della classe del controllo.

Osservazioni:

GetUserTypeNameID e GetMiscStatus sono funzioni virtuali pure, dichiarate in COleControl. Poiché queste funzioni sono virtuali pure, è necessario eseguirne l'override nella classe di controllo. Oltre a DECLARE_OLECTLTYPE, è necessario aggiungere la IMPLEMENT_OLECTLTYPE macro alla dichiarazione della classe di controllo.

Requisiti

Intestazione: afxctl.h

DECLARE_PROPPAGEIDS

Dichiara che il controllo OLE fornisce un elenco di pagine delle proprietà per visualizzarne le proprietà.

Sintassi

DECLARE_PROPPAGEIDS( class_name )

Parametri

class_name
Nome della classe di controllo proprietaria delle pagine delle proprietà.

Osservazioni:

Usare la DECLARE_PROPPAGEIDS macro alla fine della dichiarazione di classe. Quindi, nel .cpp file che definisce le funzioni membro per la classe, utilizzare la BEGIN_PROPPAGEIDS macro, le voci di macro per ognuna delle pagine delle proprietà del controllo e la END_PROPPAGEIDS macro per dichiarare la fine dell'elenco delle pagine delle proprietà.

Per altre informazioni sulle pagine delle proprietà, vedere l'articolo Controlli ActiveX: Pagine delle proprietà.

Requisiti

Intestazione: afxctl.h

DECLARE_SERIAL

Genera il codice di intestazione C++ necessario per una CObjectclasse derivata da che può essere serializzata.

DECLARE_SERIAL(class_name)

Parametri

class_name
Nome effettivo della classe.

Osservazioni:

La serializzazione è il processo di scrittura o lettura del contenuto di un oggetto da e verso un file.

Usare la DECLARE_SERIAL macro in un .h modulo e quindi includere tale modulo in tutti i .cpp moduli che devono accedere agli oggetti di questa classe.

Se DECLARE_SERIAL è incluso nella dichiarazione di classe, IMPLEMENT_SERIAL è necessario includere nell'implementazione della classe .

La DECLARE_SERIAL macro include tutte le funzionalità di DECLARE_DYNAMIC e DECLARE_DYNCREATE.

È possibile utilizzare la AFX_API macro per esportare automaticamente l'operatore CArchive di estrazione per le classi che utilizzano le DECLARE_SERIAL macro e IMPLEMENT_SERIAL . Inserire tra parentesi le dichiarazioni di classe (che si trovano nel .h file) con il codice seguente:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Per altre informazioni sulla DECLARE_SERIAL macro, vedere CObject Argomenti della classe.

Esempio

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

   // remainder of class declaration omitted

Requisiti

Intestazione: afx.h

IMPLEMENT_DYNAMIC

Genera il codice C++ necessario per una classe derivata danamico CObjectcon accesso in fase di esecuzione al nome e alla posizione della classe all'interno della gerarchia.

IMPLEMENT_DYNAMIC(class_name, base_class_name)

Parametri

class_name
Nome effettivo della classe.

base_class_name
Nome della classe di base.

Osservazioni:

Usare la IMPLEMENT_DYNAMIC macro in un .cpp modulo e quindi collegare il codice dell'oggetto risultante una sola volta.

Per altre informazioni, vedere CObject Argomenti sulle classi.

Esempio

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

Requisiti

Intestazione: afx.h

IMPLEMENT_DYNCREATE

Consente la creazione dinamica degli oggetti delle CObjectclassi derivate da in fase di esecuzione quando viene usata con la DECLARE_DYNCREATE macro.

IMPLEMENT_DYNCREATE(class_name, base_class_name)

Parametri

class_name
Nome effettivo della classe.

base_class_name
Nome effettivo della classe base.

Osservazioni:

Il framework usa questa possibilità per creare nuovi oggetti in modo dinamico, ad esempio quando legge un oggetto dal disco durante la serializzazione. Aggiungere la IMPLEMENT_DYNCREATE macro nel file di implementazione della classe. Per altre informazioni, vedere CObject Argomenti sulle classi.

Se si usano le DECLARE_DYNCREATE macro e IMPLEMENT_DYNCREATE , è quindi possibile utilizzare la RUNTIME_CLASS macro e la CObject::IsKindOf funzione membro per determinare la classe degli oggetti in fase di esecuzione.

Se DECLARE_DYNCREATE è incluso nella dichiarazione di classe, IMPLEMENT_DYNCREATE è necessario includere nell'implementazione della classe .

Si noti che questa definizione di macro richiamerà il costruttore predefinito per la classe. Se un costruttore non semplice viene implementato in modo esplicito dalla classe , deve anche implementare in modo esplicito anche il costruttore predefinito. Il costruttore predefinito può essere aggiunto alle sezioni del membro o protected della private classe per impedire che venga chiamato dall'esterno dell'implementazione della classe.

Esempio

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)

Requisiti

Intestazione: afx.h

IMPLEMENT_OLECREATE_FLAGS

Questa macro o IMPLEMENT_OLECREATE deve essere visualizzata nel file di implementazione per qualsiasi classe che usa DECLARE_OLECREATE.

Sintassi

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

Parametri

class_name
Nome effettivo della classe.

external_name
Nome dell'oggetto esposto ad altre applicazioni (racchiuso tra virgolette).

nFlags
Contiene uno o più flag seguenti:

  • afxRegInsertable Consente di visualizzare il controllo nella finestra di dialogo Inserisci oggetto per gli oggetti OLE.
  • afxRegApartmentThreading Imposta il modello di threading nel Registro di sistema su ThreadingModel=Apartment.
  • afxRegFreeThreading Imposta il modello di threading nel Registro di sistema su ThreadingModel=Free.

È possibile combinare i due flag afxRegApartmentThreading e afxRegFreeThreading impostare ThreadingModel=Both. Per altre informazioni sulla registrazione del modello di threading, vedere InprocServer32 in Windows SDK.

l, w1, b1, b2, b5b6b3b4, b8 b7Components del CLSID della classe. w2

Osservazioni:

Nota

Se si usa IMPLEMENT_OLECREATE_FLAGS, è possibile specificare il modello di threading supportato dall'oggetto usando il nFlags parametro . Se si vuole supportare solo il modello a tapisatura singola, usare IMPLEMENT_OLECREATE.

Il nome esterno è l'identificatore esposto ad altre applicazioni. Le applicazioni client usano il nome esterno per richiedere un oggetto di questa classe da un server di automazione.

L'ID classe OLE è un identificatore univoco a 128 bit per l'oggetto. È costituito da uno long, due **WORDs e otto **BYTEs, come rappresentato da l, w1, w2e b1 da nella b8 descrizione della sintassi. La Creazione guidata applicazione e le procedure guidate del codice creano ID classe OLE univoci in base alle esigenze.

Requisiti

Intestazione: afxdisp.h

IMPLEMENT_OLECTLTYPE

Implementa le GetUserTypeNameID funzioni membro e GetMiscStatus della classe di controllo.

Sintassi

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

Parametri

class_name
Nome della classe del controllo.

idsUserTypeName
ID risorsa di una stringa contenente il nome esterno del controllo.

dwOleMisc
Enumerazione contenente uno o più flag. Per altre informazioni su questa enumerazione, vedere OLEMISC in Windows SDK.

Osservazioni:

Oltre a IMPLEMENT_OLECTLTYPE, è necessario aggiungere la DECLARE_OLECTLTYPE macro alla dichiarazione della classe di controllo.

La GetUserTypeNameID funzione membro restituisce la stringa di risorsa che identifica la classe del controllo. GetMiscStatus restituisce i OLEMISC bit per il controllo. Questa enumerazione specifica una raccolta di impostazioni che descrivono caratteristiche varie del controllo. Per una descrizione completa delle OLEMISC impostazioni, vedere OLEMISC in Windows SDK.

Nota

Le impostazioni predefinite usate da ActiveX ControlWizard sono: OLEMISC_ACTIVATEWHENVISIBLE, OLEMISC_SETCLIENTSITEFIRST, OLEMISC_INSIDEOUTOLEMISC_CANTLINKINSIDE, e OLEMISC_RECOMPOSEONRESIZE.

Requisiti

Intestazione: afxctl.h

IMPLEMENT_SERIAL

Genera il codice C++ necessario per una classe derivata danamico CObjectcon accesso in fase di esecuzione al nome e alla posizione della classe all'interno della gerarchia.

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

Parametri

class_name
Nome effettivo della classe.

base_class_name
Nome della classe di base.

wSchema
Un "numero di versione" UINT che verrà codificato nell'archivio per consentire a un programma di deserializzazione di identificare e gestire i dati creati dalle versioni precedenti del programma. Il numero dello schema della classe non deve essere -1.

Osservazioni:

Usare la IMPLEMENT_SERIAL macro in un .cpp modulo, quindi collegare il codice oggetto risultante una sola volta.

È possibile utilizzare la AFX_API macro per esportare automaticamente l'operatore CArchive di estrazione per le classi che utilizzano le DECLARE_SERIAL macro e IMPLEMENT_SERIAL . Inserire tra parentesi le dichiarazioni di classe (che si trovano nel .h file) con il codice seguente:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Per altre informazioni, vedere Argomenti sulle CObject classi.

Esempio

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

Requisiti

Intestazione: afx.h

RUNTIME_CLASS

Ottiene la struttura della classe di runtime dal nome di una classe C++.

RUNTIME_CLASS(class_name)

Parametri

class_name
Nome effettivo della classe (non racchiuso tra virgolette).

Osservazioni:

RUNTIME_CLASS restituisce un puntatore a una CRuntimeClass struttura per la classe specificata da class_name. Solo CObjectle classi derivate da dichiarate con DECLARE_DYNAMIC, DECLARE_DYNCREATEo DECLARE_SERIAL restituiscono puntatori a una CRuntimeClass struttura.

Per altre informazioni, vedere CObject Argomenti sulle classi.

Esempio

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

Requisiti

Intestazione: afx.h

DECLARE_OLECREATE

Consente la creazione di oggetti di CCmdTargetclassi derivate da tramite l'automazione OLE.

DECLARE_OLECREATE(class_name)

Parametri

class_name
Nome effettivo della classe.

Osservazioni:

Questa macro consente ad altre applicazioni abilitate per OLE di creare oggetti di questo tipo.

Aggiungere la DECLARE_OLECREATE macro nel .h modulo per la classe e quindi includere tale modulo in tutti i .cpp moduli che devono accedere agli oggetti di questa classe.

Se DECLARE_OLECREATE è incluso nella dichiarazione di classe, IMPLEMENT_OLECREATE è necessario includere nell'implementazione della classe . Una dichiarazione di classe che usa DECLARE_OLECREATE deve usare DECLARE_DYNCREATE anche o DECLARE_SERIAL.

Requisiti

Intestazione: afxdisp.h

IMPLEMENT_OLECREATE

Questa macro o IMPLEMENT_OLECREATE_FLAGS deve essere visualizzata nel file di implementazione per qualsiasi classe che usa DECLARE_OLECREATE.

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

Parametri

class_name
Nome effettivo della classe.

external_name
Nome dell'oggetto esposto ad altre applicazioni (racchiuso tra virgolette).

l, w1, b1, b2, b5b6b3b4, b8 b7Components del CLSID della classe. w2

Osservazioni:

Nota

Se si usa IMPLEMENT_OLECREATE, per impostazione predefinita, è supportato solo il modello a threading singolo. Se si usa IMPLEMENT_OLECREATE_FLAGS, è possibile specificare il modello di threading supportato dall'oggetto usando il nFlags parametro .

Il nome esterno è l'identificatore esposto ad altre applicazioni. Le applicazioni client usano il nome esterno per richiedere un oggetto di questa classe da un server di automazione.

L'ID classe OLE è un identificatore univoco a 128 bit per l'oggetto. È costituito da uno long, due **WORDs e otto **BYTEs, come rappresentato da l, w1, w2e b1 da nella b8 descrizione della sintassi. La Creazione guidata applicazione e le procedure guidate del codice creano ID classe OLE univoci in base alle esigenze.

Requisiti

Intestazione: afxdisp.h

Vedi anche

Macro e globali
Isolamento della libreria di controlli comuni MFC
Chiave CLSID