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 CObject
classi 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 CObject
classe 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 CObject
con 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 CObject
classi 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 suThreadingModel=Apartment
.afxRegFreeThreading
Imposta il modello di threading nel Registro di sistema suThreadingModel=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
, b5
b6
b3
b4
, b8
b7
Components 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 **WORD
s e otto **BYTE
s, come rappresentato da l
, w1
, w2
e 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_INSIDEOUT
OLEMISC_CANTLINKINSIDE
, e OLEMISC_RECOMPOSEONRESIZE
.
Requisiti
Intestazione: afxctl.h
IMPLEMENT_SERIAL
Genera il codice C++ necessario per una classe derivata danamico CObject
con 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 CObject
le classi derivate da dichiarate con DECLARE_DYNAMIC
, DECLARE_DYNCREATE
o 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 CCmdTarget
classi 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
, b5
b6
b3
b4
, b8
b7
Components 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 **WORD
s e otto **BYTE
s, come rappresentato da l
, w1
, w2
e 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