Macros de mappage de services
Ces macros définissent des mappages de service et des entrées.
Nom | Description |
---|---|
BEGIN_SERVICE_MAP | Marque le début d’une carte de service ATL. |
END_SERVICE_MAP | Marque la fin d’une carte de service ATL. |
SERVICE_ENTRY | Indique que l’objet prend en charge un ID de service spécifique. |
SERVICE_ENTRY_CHAIN | Indique à IServiceProviderImpl ::QueryService de chaîner l’objet spécifié. |
Spécifications
En-tête : atlcom.h
BEGIN_SERVICE_MAP
Marque le début de la carte de service.
BEGIN_SERVICE_MAP(theClass)
Paramètres
theClass
[in] Spécifie la classe contenant le mappage de service.
Notes
Utilisez la carte de service pour implémenter des fonctionnalités de fournisseur de services sur votre objet COM. Tout d’abord, vous devez dériver votre classe de IServiceProviderImpl. Il existe deux types d’entrées :
SERVICE_ENTRY Indique la prise en charge de l’ID de service (SID) spécifié.
SERVICE_ENTRY_CHAIN indique à IServiceProviderImpl ::QueryService de chaîner à un autre objet spécifié.
Exemple
BEGIN_SERVICE_MAP(CMyService)
SERVICE_ENTRY(SID_SBindHost) // This object supports the SBindHost service
SERVICE_ENTRY_CHAIN(m_spClientSite) // Everything else, just ask the container
END_SERVICE_MAP()
END_SERVICE_MAP
Marque la fin de la carte de service.
END_SERVICE_MAP()
Exemple
Consultez l’exemple de BEGIN_SERVICE_MAP.
SERVICE_ENTRY
Indique que l’objet prend en charge l’ID de service spécifié par SID.
SERVICE_ENTRY( SID )
Paramètres
SID
ID de service.
Exemple
Consultez l’exemple de BEGIN_SERVICE_MAP.
SERVICE_ENTRY_CHAIN
Indique à IServiceProviderImpl ::QueryService de chaîner l’objet spécifié par punk.
SERVICE_ENTRY_CHAIN( punk )
Paramètres
punk
Pointeur vers l’interface IUnknown vers laquelle chaîner.
Exemple
Consultez l’exemple de BEGIN_SERVICE_MAP.
IServiceProviderImpl ::QueryService
Crée ou accède au service spécifié et retourne un pointeur d’interface vers l’interface spécifiée pour le service.
STDMETHOD(QueryService)(
REFGUID guidService,
REFIID riid,
void** ppvObject);
Paramètres
guidService
[in] Pointeur vers un identificateur de service (SID).
riid
[in] Identificateur de l’interface à laquelle l’appelant doit accéder.
ppvObj
[out] Pointeur indirect vers l’interface demandée.
Valeur de retour
HrESULT retourné est l’une des valeurs suivantes :
Valeur retournée | Signification |
---|---|
S_OK | Le service a été correctement créé ou récupéré. |
E_INVALIDARG | Un ou plusieurs arguments ne sont pas valides. |
E_OUTOFMEMORY | La mémoire est insuffisante pour créer le service. |
E_UNEXPECTED | Une erreur inconnue s’est produite. |
E_NOINTERFACE | L’interface demandée ne fait pas partie de ce service, ou le service est inconnu. |
Notes
QueryService
retourne un pointeur indirect vers l’interface demandée dans le service spécifié. L’appelant est chargé de libérer ce pointeur lorsqu’il n’est plus nécessaire.
Lorsque vous appelez QueryService
, vous passez à la fois un identificateur de service (guidService) et un identificateur d’interface (riid). GuidService spécifie le service auquel vous souhaitez accéder, et le riid identifie une interface qui fait partie du service. En retour, vous recevez un pointeur indirect vers l’interface.
L’objet qui implémente l’interface peut également implémenter des interfaces qui font partie d’autres services. Tenez compte des possibilités suivantes :
Certaines de ces interfaces peuvent être facultatives. Toutes les interfaces définies dans la description du service ne sont pas nécessairement présentes sur chaque implémentation du service ou sur chaque objet retourné.
Contrairement aux appels à
QueryInterface
, le passage d’un identificateur de service différent ne signifie pas nécessairement qu’un objet COM (Component Object Model) différent est retourné.L’objet retourné peut avoir d’autres interfaces qui ne font pas partie de la définition du service.
Deux services différents, tels que SID_SMyService et SID_SYourService, peuvent tous deux spécifier l’utilisation de la même interface, même si l’implémentation de l’interface n’a peut-être rien en commun entre les deux services. Cette approche fonctionne, car un appel à QueryService
(SID_SMyService, IID_IDispatch) peut retourner un objet QueryService
différent de (SID_SYourService, IID_IDispatch). L’identité d’objet n’est pas supposée lorsque vous spécifiez un autre identificateur de service.