macro COM_INTERFACE_ENTRY
Queste macro immettono le interfacce di un oggetto nella relativa mappa COM in modo che possano essere accessibili da QueryInterface
. L'ordine delle voci nella mappa COM è che le interfacce degli ordini verranno controllate per un IID corrispondente durante QueryInterface
.
Macro | Descrizione |
---|---|
COM_INTERFACE_ENTRY | Inserisce le interfacce nella mappa dell'interfaccia COM. |
COM_INTERFACE_ENTRY2 | Utilizzare questa macro per evitare ambiguità tra due rami di ereditarietà. |
COM_INTERFACE_ENTRY_IID | Utilizzare questa macro per immettere l'interfaccia nella mappa COM e specificare il relativo IID. |
COM_INTERFACE_ENTRY2_IID | Uguale a COM_INTERFACE_ENTRY2, con la differenza che è possibile specificare un IID diverso. |
COM_INTERFACE_ENTRY_AGGREGATE | Quando viene eseguita una query sull'interfaccia identificata da iid , COM_INTERFACE_ENTRY_AGGREGATE inoltra a punk . |
COM_INTERFACE_ENTRY_AGGREGATE_BLIND | Come COM_INTERFACE_ENTRY_AGGREGATE, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID comporta l'inoltro della query a punk. |
COM_INTERFACE_ENTRY_AUTOAGGREGATE | Come COM_INTERFACE_ENTRY_AGGREGATE, tranne se punk è NULL, crea automaticamente l'aggregazione descritta dal clsid. |
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND | Come COM_INTERFACE_ENTRY_AUTOAGGREGATE, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID comporta l'inoltro della query a punk e se punk è NULL, creando automaticamente l'aggregazione descritta dal clsid. |
COM_INTERFACE_ENTRY_BREAK | Fa in modo che il programma chiami DebugBreak quando viene eseguita una query sull'interfaccia specificata. |
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF | Salva i dati specifici dell'interfaccia per ogni istanza. |
COM_INTERFACE_ENTRY_TEAR_OFF | Espone le interfacce di strappo. |
COM_INTERFACE_ENTRY_CHAIN | Elabora la mappa COM della classe di base quando l'elaborazione raggiunge questa voce nella mappa COM. |
COM_INTERFACE_ENTRY_FUNC | Un meccanismo generale per l'associazione alla logica di QueryInterface ATL. |
COM_INTERFACE_ENTRY_FUNC_BLIND | Come COM_INTERFACE_ENTRY_FUNC, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID genera una chiamata a func. |
COM_INTERFACE_ENTRY_NOINTERFACE | Restituisce E_NOINTERFACE e termina l'elaborazione della mappa COM quando viene eseguita una query sull'interfaccia specificata. |
Requisiti
Intestazione: atlcom.h
COM_INTERFACE_ENTRY
Inserisce le interfacce nella mappa dell'interfaccia COM.
Sintassi
COM_INTERFACE_ENTRY( x )
Parametri
x
[in] Il nome di un'interfaccia da cui deriva direttamente l'oggetto classe.
Osservazioni:
In genere, si tratta del tipo di voce usato più spesso.
Esempio
BEGIN_COM_MAP(CThisExample)
COM_INTERFACE_ENTRY(IThisExample)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
Requisiti
Intestazione: atlcom.h
COM_INTERFACE_ENTRY2
Utilizzare questa macro per evitare ambiguità tra due rami di ereditarietà.
COM_INTERFACE_ENTRY2(x, x2)
Parametri
x
[in] Nome di un'interfaccia da esporre dall'oggetto.
x2
[in] Nome del ramo di ereditarietà da cui viene esposto x .
Osservazioni:
Ad esempio, se si deriva l'oggetto classe da due interfacce doppie, si espone IDispatch
usando COM_INTERFACE_ENTRY2 poiché IDispatch
è possibile ottenere da una delle interfacce.
Esempio
class ATL_NO_VTABLE CEntry2Example :
public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
CEntry2Example()
{
}
BEGIN_COM_MAP(CEntry2Example)
COM_INTERFACE_ENTRY(IEntry2Example)
COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};
COM_INTERFACE_ENTRY_IID
Utilizzare questa macro per immettere l'interfaccia nella mappa COM e specificare il relativo IID.
COM_INTERFACE_ENTRY_IID(iid, x)
Parametri
iid
[in] GUID dell'interfaccia esposta.
x
[in] Nome della classe la cui tabella virtuale verrà esposta come interfaccia identificata da iid.
Esempio
BEGIN_COM_MAP(CExample)
COM_INTERFACE_ENTRY(IExample)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
COM_INTERFACE_ENTRY(IExampleBase)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
COM_INTERFACE_ENTRY2_IID
Uguale a COM_INTERFACE_ENTRY2, con la differenza che è possibile specificare un IID diverso.
COM_INTERFACE_ENTRY2_IID(iid, x, x2)
Parametri
iid
[in] GUID specificato per l'interfaccia.
x
[in] Nome di un'interfaccia derivata direttamente dall'oggetto classe.
x2
[in] Nome di una seconda interfaccia derivata direttamente dall'oggetto classe.
COM_INTERFACE_ENTRY_AGGREGATE
Quando viene eseguita una query sull'interfaccia identificata da iid , COM_INTERFACE_ENTRY_AGGREGATE inoltra a punk.
COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)
Parametri
iid
[in] GUID dell'interfaccia per cui è stata generata una query.
Punk
[in] Nome di un puntatore IUnknown
.
Osservazioni:
Si presuppone che il parametro punk punti all'interno sconosciuto di un aggregato o a NULL, nel qual caso la voce viene ignorata. In genere, si farebbe CoCreate
l'aggregazione in FinalConstruct
.
Esempio
BEGIN_COM_MAP(COuter1)
COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()
COM_INTERFACE_ENTRY_AGGREGATE_BLIND
Come COM_INTERFACE_ENTRY_AGGREGATE, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID comporta l'inoltro della query a punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)
Parametri
Punk
[in] Nome di un puntatore IUnknown
.
Osservazioni:
Se la query di interfaccia non riesce, l'elaborazione della mappa COM continua.
Esempio
BEGIN_COM_MAP(COuter2)
COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()
COM_INTERFACE_ENTRY_AUTOAGGREGATE
Come COM_INTERFACE_ENTRY_AGGREGATE, tranne se punk è NULL, crea automaticamente l'aggregazione descritta dal clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)
Parametri
iid
[in] GUID dell'interfaccia per cui è stata generata una query.
Punk
[in] Nome di un puntatore IUnknown
. Deve essere un membro della classe contenente la mappa COM.
clsid
[in] Identificatore dell'aggregazione che verrà creata se punk è NULL.
Osservazioni:
Esempio
BEGIN_COM_MAP(COuter3)
COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND
Come COM_INTERFACE_ENTRY_AUTOAGGREGATE, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID comporta l'inoltro della query a punk e se punk è NULL, creando automaticamente l'aggregazione descritta dal clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)
Parametri
Punk
[in] Nome di un puntatore IUnknown
. Deve essere un membro della classe contenente la mappa COM.
clsid
[in] Identificatore dell'aggregazione che verrà creata se punk è NULL.
Osservazioni:
Se la query di interfaccia non riesce, l'elaborazione della mappa COM continua.
Esempio
BEGIN_COM_MAP(COuter4)
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()
COM_INTERFACE_ENTRY_BREAK
Fa in modo che il programma chiami DebugBreak quando viene eseguita una query sull'interfaccia specificata.
COM_INTERFACE_ENTRY_BREAK(x)
Parametri
x
[in] Testo utilizzato per costruire l'identificatore dell'interfaccia.
Osservazioni:
L'IID dell'interfaccia verrà costruito aggiungendo x a IID_
. Ad esempio, se x è IPersistStorage
, l'IID sarà IID_IPersistStorage
.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF
Salva i dati specifici dell'interfaccia per ogni istanza.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)
Parametri
iid
[in] GUID dell'interfaccia di disinstallazione.
x
[in] Nome della classe che implementa l'interfaccia.
Punk
[in] Nome di un puntatore IUnknown
. Deve essere un membro della classe contenente la mappa COM. Deve essere inizializzato su NULL nel costruttore dell'oggetto classe.
Osservazioni:
Se l'interfaccia non viene usata, riduce le dimensioni complessive dell'istanza dell'oggetto.
Esempio
BEGIN_COM_MAP(COuter)
COM_INTERFACE_ENTRY(IOuter)
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()
COM_INTERFACE_ENTRY_TEAR_OFF
Espone le interfacce di strappo.
COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)
Parametri
iid
[in] GUID dell'interfaccia di disinstallazione.
x
[in] Nome della classe che implementa l'interfaccia.
Osservazioni:
Un'interfaccia di disinstallazione viene implementata come oggetto separato di cui viene creata un'istanza ogni volta che viene eseguita una query sull'interfaccia rappresentata. In genere, si compila l'interfaccia come strappo se l'interfaccia viene usata raramente, poiché in questo modo viene salvato un puntatore di tabella virtuale in ogni istanza dell'oggetto principale. L'eliminazione viene eliminata quando il conteggio dei riferimenti diventa zero. La classe che implementa lo strappo deve essere derivata da CComTearOffObjectBase
e avere una propria mappa COM.
Esempio
BEGIN_COM_MAP(CBeeper)
COM_INTERFACE_ENTRY(IBeeper)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()
COM_INTERFACE_ENTRY_CHAIN
Elabora la mappa COM della classe di base quando l'elaborazione raggiunge questa voce nella mappa COM.
COM_INTERFACE_ENTRY_CHAIN(classname)
Parametri
nomeclasse
[in] Classe di base dell'oggetto corrente.
Osservazioni:
Ad esempio, nel codice seguente:
BEGIN_COM_MAP(COuterObject)
COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()
Si noti che la prima voce della mappa COM deve essere un'interfaccia sull'oggetto contenente la mappa COM. Pertanto, non è possibile avviare le voci della mappa COM con COM_INTERFACE_ENTRY_CHAIN, causando la ricerca della mappa COM di un oggetto diverso nel punto in cui COM_INTERFACE_ENTRY_CHAIN(COtherObject
) viene visualizzata nella mappa COM dell'oggetto. Per cercare prima di tutto la mappa COM di un altro oggetto, aggiungere una voce di interfaccia per IUnknown
alla mappa COM, quindi concatenare la mappa COM dell'altro oggetto. Ad esempio:
BEGIN_COM_MAP(CThisObject)
COM_INTERFACE_ENTRY(IUnknown)
COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()
COM_INTERFACE_ENTRY_FUNC
Un meccanismo generale per l'associazione alla logica di QueryInterface
ATL.
COM_INTERFACE_ENTRY_FUNC(iid, dw, func)
Parametri
iid
[in] GUID dell'interfaccia esposta.
dw
[in] Parametro passato al func.
func
[in] Puntatore di funzione che restituirà iid.
Osservazioni:
Se iid corrisponde all'IID dell'interfaccia per cui viene eseguita una query, viene chiamata la funzione specificata da func . La dichiarazione per la funzione deve essere:
HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);
Quando viene chiamata la funzione, pv
punta all'oggetto classe. Il parametro riid fa riferimento all'interfaccia per cui viene eseguita una query, ppv
è il puntatore alla posizione in cui la funzione deve archiviare il puntatore all'interfaccia e dw è il parametro specificato nella voce. La funzione deve impostare * ppv
su NULL e restituire E_NOINTERFACE o S_FALSE se sceglie di non restituire un'interfaccia. Con E_NOINTERFACE, l'elaborazione delle mappe COM termina. Con S_FALSE, l'elaborazione delle mappe COM continua, anche se non è stato restituito alcun puntatore di interfaccia. Se la funzione restituisce un puntatore all'interfaccia, deve restituire S_OK.
COM_INTERFACE_ENTRY_FUNC_BLIND
Come COM_INTERFACE_ENTRY_FUNC, ad eccezione del fatto che l'esecuzione di query per qualsiasi IID genera una chiamata a func.
COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)
Parametri
dw
[in] Parametro passato al func.
func
[in] Funzione che viene chiamata quando questa voce nella mappa COM viene elaborata.
Osservazioni:
Eventuali errori causeranno la continuazione dell'elaborazione sulla mappa COM. Se la funzione restituisce un puntatore all'interfaccia, deve restituire S_OK.
COM_INTERFACE_ENTRY_NOINTERFACE
Restituisce E_NOINTERFACE e termina l'elaborazione della mappa COM quando viene eseguita una query sull'interfaccia specificata.
COM_INTERFACE_ENTRY_NOINTERFACE(x)
Parametri
x
[in] Testo utilizzato per costruire l'identificatore dell'interfaccia.
Osservazioni:
È possibile utilizzare questa macro per impedire l'utilizzo di un'interfaccia in un caso specifico. Ad esempio, è possibile inserire questa macro nella mappa COM immediatamente prima di COM_INTERFACE_ENTRY_AGGREGATE_BLIND per impedire l'inoltro di una query per l'interfaccia all'interno dell'aggregazione sconosciuta.
L'IID dell'interfaccia verrà costruito aggiungendo x a IID_
. Ad esempio, se x è IPersistStorage
, l'IID sarà IID_IPersistStorage
.