Partage via


COM_INTERFACE_ENTRY Macros

Ces macros entrent les interfaces d’un objet dans sa carte COM afin qu’elles soient accessibles par QueryInterface. L’ordre des entrées dans la carte COM est que les interfaces d’ordre sont case activée pour un IID correspondant pendant QueryInterface.

Macro Description
COM_INTERFACE_ENTRY Entre les interfaces dans le mappage d’interface COM.
COM_INTERFACE_ENTRY2 Utilisez cette macro pour lever l’ambiguïté entre deux branches d’héritage.
COM_INTERFACE_ENTRY_IID Utilisez cette macro pour entrer l’interface dans la carte COM et spécifier son IID.
COM_INTERFACE_ENTRY2_IID Identique à COM_INTERFACE_ENTRY2, sauf que vous pouvez spécifier un ID IID différent.
COM_INTERFACE_ENTRY_AGGREGATE Lorsque l’interface identifiée par iid est interrogée, COM_INTERFACE_ENTRY_AGGREGATE transfère à punk.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND Identique à COM_INTERFACE_ENTRY_AGGREGATE, sauf que l’interrogation pour n’importe quel IID entraîne le transfert de la requête à punk.
COM_INTERFACE_ENTRY_AUTOAGGREGATE Identique à COM_INTERFACE_ENTRY_AGGREGATE, sauf si punk est NULL, il crée automatiquement l’agrégat décrit par le clsid.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND Identique à COM_INTERFACE_ENTRY_AUTOAGGREGATE, sauf que l’interrogation d’un IID entraîne le transfert de la requête à punk, et si punk a la valeur NULL, créez automatiquement l’agrégat décrit par le clsid.
COM_INTERFACE_ENTRY_BREAK Provoque l’appel de DebugBreak à votre programme lorsque l’interface spécifiée est interrogée.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF Enregistre les données spécifiques à l’interface pour chaque instance.
COM_INTERFACE_ENTRY_TEAR_OFF Expose vos interfaces de déchirure.
COM_INTERFACE_ENTRY_CHAIN Traite la carte COM de la classe de base lorsque le traitement atteint cette entrée dans la carte COM.
COM_INTERFACE_ENTRY_FUNC Mécanisme général de connexion à la logique d’ATL QueryInterface .
COM_INTERFACE_ENTRY_FUNC_BLIND Identique à COM_INTERFACE_ENTRY_FUNC, sauf que l’interrogation d’un IID entraîne un appel à func.
COM_INTERFACE_ENTRY_NOINTERFACE Retourne E_NOINTERFACE et met fin au traitement de la carte COM lorsque l’interface spécifiée est interrogée.

Spécifications

En-tête : atlcom.h

COM_INTERFACE_ENTRY

Entre les interfaces dans le mappage d’interface COM.

Syntaxe

COM_INTERFACE_ENTRY( x )

Paramètres

x
[in] Le nom d’une interface de votre objet de classe dérive directement.

Notes

En règle générale, il s’agit du type d’entrée que vous utilisez le plus souvent.

Exemple

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

Spécifications

En-tête : atlcom.h

COM_INTERFACE_ENTRY2

Utilisez cette macro pour lever l’ambiguïté entre deux branches d’héritage.

COM_INTERFACE_ENTRY2(x, x2)

Paramètres

x
[in] Nom d’une interface que vous souhaitez exposer à partir de votre objet.

x2
[in] Nom de la branche d’héritage à partir de laquelle x est exposé.

Notes

Par exemple, si vous dérivez votre objet de classe à partir de deux interfaces doubles, vous exposez IDispatch à l’aide de COM_INTERFACE_ENTRY2, car IDispatch vous pouvez obtenir à partir de l’une des interfaces.

Exemple

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

Utilisez cette macro pour entrer l’interface dans la carte COM et spécifier son IID.

COM_INTERFACE_ENTRY_IID(iid, x)

Paramètres

Iid
[in] GUID de l’interface exposée.

x
[in] Nom de la classe dont la table virtuelle sera exposée en tant qu’interface identifiée par iid.

Exemple

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

Identique à COM_INTERFACE_ENTRY2, sauf que vous pouvez spécifier un ID IID différent.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

Paramètres

Iid
[in] GUID que vous spécifiez pour l’interface.

x
[in] Nom d’une interface à partir de laquelle votre objet de classe dérive directement.

x2
[in] Nom d’une deuxième interface à partir de laquelle votre objet de classe dérive directement.

COM_INTERFACE_ENTRY_AGGREGATE

Lorsque l’interface identifiée par iid est interrogée, COM_INTERFACE_ENTRY_AGGREGATE transfère à punk.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

Paramètres

Iid
[in] GUID de l’interface interrogée.

Punk
[in] Nom d’un IUnknown pointeur.

Notes

Le paramètre punk est supposé pointer vers l’inconnu interne d’un agrégat ou sur NULL, auquel cas l’entrée est ignorée. En règle générale, vous feriez CoCreate l’agrégation en FinalConstruct.

Exemple

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

Identique à COM_INTERFACE_ENTRY_AGGREGATE, sauf que l’interrogation pour n’importe quel IID entraîne le transfert de la requête à punk.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

Paramètres

Punk
[in] Nom d’un IUnknown pointeur.

Notes

Si la requête d’interface échoue, le traitement de la carte COM se poursuit.

Exemple

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

Identique à COM_INTERFACE_ENTRY_AGGREGATE, sauf si punk est NULL, il crée automatiquement l’agrégat décrit par le clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

Paramètres

Iid
[in] GUID de l’interface interrogée.

Punk
[in] Nom d’un IUnknown pointeur. Doit être membre de la classe contenant la carte COM.

Clsid
[in] Identificateur de l’agrégat qui sera créé si punk est NULL.

Notes

Exemple

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

Identique à COM_INTERFACE_ENTRY_AUTOAGGREGATE, sauf que l’interrogation d’un IID entraîne le transfert de la requête à punk, et si punk a la valeur NULL, créez automatiquement l’agrégat décrit par le clsid.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

Paramètres

Punk
[in] Nom d’un IUnknown pointeur. Doit être membre de la classe contenant la carte COM.

Clsid
[in] Identificateur de l’agrégat qui sera créé si punk est NULL.

Notes

Si la requête d’interface échoue, le traitement de la carte COM se poursuit.

Exemple

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

Provoque l’appel de DebugBreak à votre programme lorsque l’interface spécifiée est interrogée.

COM_INTERFACE_ENTRY_BREAK(x)

Paramètres

x
[in] Texte utilisé pour construire l’identificateur d’interface.

Notes

L’interface IID sera construite en ajoutant x à IID_. Par exemple, si x est IPersistStorage, l’IID sera IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

Enregistre les données spécifiques à l’interface pour chaque instance.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

Paramètres

Iid
[in] GUID de l’interface de déchirure.

x
[in] Nom de la classe implémentant l’interface.

Punk
[in] Nom d’un IUnknown pointeur. Doit être membre de la classe contenant la carte COM. Doit être initialisé sur NULL dans le constructeur de l’objet de classe.

Notes

Si l’interface n’est pas utilisée, cela réduit la taille d’instance globale de votre objet.

Exemple

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

Expose vos interfaces de déchirure.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

Paramètres

Iid
[in] GUID de l’interface de déchirure.

x
[in] Nom de la classe implémentant l’interface.

Notes

Une interface de déchirure est implémentée en tant qu’objet distinct instancié chaque fois que l’interface qu’elle représente est interrogée. En règle générale, vous générez votre interface en tant que déchirure si l’interface est rarement utilisée, car cela enregistre un pointeur de table virtuelle dans chaque instance de votre objet principal. La suppression est supprimée lorsque son nombre de références devient zéro. La classe qui implémente la déchirure doit être dérivée CComTearOffObjectBase et avoir sa propre carte COM.

Exemple

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

Traite la carte COM de la classe de base lorsque le traitement atteint cette entrée dans la carte COM.

COM_INTERFACE_ENTRY_CHAIN(classname)

Paramètres

classname
[in] Classe de base de l’objet actuel.

Notes

Par exemple, dans le code suivant :

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

Notez que la première entrée de la carte COM doit être une interface sur l’objet contenant la carte COM. Par conséquent, vous ne pouvez pas démarrer vos entrées de mappage COM avec COM_INTERFACE_ENTRY_CHAIN, ce qui entraîne la recherche com d’un autre objet au point où COM_INTERFACE_ENTRY_CHAIN(COtherObject) apparaît dans la carte COM de votre objet. Si vous souhaitez d’abord rechercher la carte COM d’un autre objet, ajoutez une entrée d’interface pour IUnknown votre carte COM, puis chaînez la carte COM de l’autre objet. Par exemple :

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

Mécanisme général de connexion à la logique d’ATL QueryInterface .

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

Paramètres

Iid
[in] GUID de l’interface exposée.

dw
[in] Paramètre transmis au func.

func
[in] Pointeur de fonction qui retourne iid.

Notes

Si iid correspond à l’IID de l’interface interrogée, la fonction spécifiée par func est appelée. La déclaration de la fonction doit être :

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

Lorsque votre fonction est appelée, pv pointe vers votre objet de classe. Le paramètre riid fait référence à l’interface interrogée, ppv est le pointeur vers l’emplacement où la fonction doit stocker le pointeur vers l’interface, et dw est le paramètre que vous avez spécifié dans l’entrée. La fonction doit définir * ppv sur NULL et retourner E_NOINTERFACE ou S_FALSE si elle choisit de ne pas retourner une interface. Avec E_NOINTERFACE, le traitement de la carte COM se termine. Avec S_FALSE, le traitement de la carte COM continue, même si aucun pointeur d’interface n’a été retourné. Si la fonction retourne un pointeur d’interface, elle doit retourner S_OK.

COM_INTERFACE_ENTRY_FUNC_BLIND

Identique à COM_INTERFACE_ENTRY_FUNC, sauf que l’interrogation d’un IID entraîne un appel à func.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

Paramètres

dw
[in] Paramètre transmis au func.

func
[in] Fonction qui est appelée lorsque cette entrée dans la carte COM est traitée.

Notes

Toute défaillance entraîne la poursuite du traitement sur la carte COM. Si la fonction retourne un pointeur d’interface, elle doit retourner S_OK.

COM_INTERFACE_ENTRY_NOINTERFACE

Retourne E_NOINTERFACE et met fin au traitement de la carte COM lorsque l’interface spécifiée est interrogée.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

Paramètres

x
[in] Texte utilisé pour construire l’identificateur d’interface.

Notes

Vous pouvez utiliser cette macro pour empêcher l’utilisation d’une interface dans un cas particulier. Par exemple, vous pouvez insérer cette macro dans votre carte COM juste avant COM_INTERFACE_ENTRY_AGGREGATE_BLIND pour empêcher l’interface d’être transférée à l’inconnu interne de l’agrégat.

L’interface IID sera construite en ajoutant x à IID_. Par exemple, si x est IPersistStorage, l’IID sera IID_IPersistStorage.