Condividi tramite


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.