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 vérifiées pour obtenir 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
.