Sdílet prostřednictvím


Makra map služeb

Tato makra definují mapy a položky služeb.

Jméno popis
BEGIN_SERVICE_MAP Označí začátek mapy služby ATL.
END_SERVICE_MAP Označí konec mapy služby ATL.
SERVICE_ENTRY Označuje, že objekt podporuje konkrétní ID služby.
SERVICE_ENTRY_CHAIN Dává pokyn IServiceProviderImpl::QueryService, aby zřetězoval zadaný objekt.

Požadavky

Hlavička: atlcom.h

BEGIN_SERVICE_MAP

Označí začátek mapy služby.

BEGIN_SERVICE_MAP(theClass)

Parametry

theClass
[v] Určuje třídu obsahující mapu služby.

Poznámky

Pomocí mapy služeb implementujte funkce poskytovatele služeb v objektu COM. Nejprve je nutné odvodit třídu z IServiceProviderImpl. Existují dva typy položek:

Příklad

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

Označí konec mapy služby.

END_SERVICE_MAP()

Příklad

Podívejte se na příklad BEGIN_SERVICE_MAP.

SERVICE_ENTRY

Označuje, že objekt podporuje ID služby určené identifikátorem SID.

SERVICE_ENTRY( SID )

Parametry

SID
ID služby.

Příklad

Podívejte se na příklad BEGIN_SERVICE_MAP.

SERVICE_ENTRY_CHAIN

Dá pokyn IServiceProviderImpl::QueryService, aby zřetězoval objekt určený punkem.

SERVICE_ENTRY_CHAIN( punk )

Parametry

Punk
Ukazatel na rozhraní IUnknown , ke kterému se má řetězit.

Příklad

Podívejte se na příklad BEGIN_SERVICE_MAP.

IServiceProviderImpl::QueryService

Vytvoří zadanou službu nebo k této službě přistupuje a vrátí ukazatel rozhraní na zadané rozhraní pro službu.

STDMETHOD(QueryService)(
    REFGUID guidService,
    REFIID riid,
    void** ppvObject);

Parametry

GuidService
[v] Ukazatel na identifikátor služby (SID).

riid
[v] Identifikátor rozhraní, ke kterému má volající získat přístup.

ppvObj
[ven] Nepřímý ukazatel na požadované rozhraní.

Vrácená hodnota

Vrácená hodnota HRESULT je jedna z následujících hodnot:

Vrácená hodnota Význam
S_OK Služba byla úspěšně vytvořena nebo načtena.
E_INVALIDARG Jeden nebo více argumentů je neplatné.
E_OUTOFMEMORY Paměť není dostatečná k vytvoření služby.
E_UNEXPECTED Došlo k neznámé chybě.
E_NOINTERFACE Požadované rozhraní není součástí této služby nebo je služba neznámá.

Poznámky

QueryService vrátí nepřímý ukazatel na požadované rozhraní v zadané službě. Volající zodpovídá za uvolnění tohoto ukazatele, pokud už není potřeba.

Při volání QueryServicepředáte identifikátor služby (guidService) i identifikátor rozhraní (riid). GuidService určuje službu, ke které chcete získat přístup, a riid identifikuje rozhraní, které je součástí služby. Ve vráceném případě obdržíte nepřímý ukazatel na rozhraní.

Objekt, který implementuje rozhraní, může také implementovat rozhraní, která jsou součástí jiných služeb. Zvažte následující možnosti:

  • Některá z těchto rozhraní můžou být volitelná. Ne všechna rozhraní definovaná v popisu služby se nutně nacházejí při každé implementaci služby nebo u každého vráceného objektu.

  • Na rozdíl od volání QueryInterfacenemusí předání jiného identifikátoru služby nutně znamenat, že je vrácen jiný objekt modelu COM (Component Object Model).

  • Vrácený objekt může mít jiná rozhraní, která nejsou součástí definice služby.

Dvě různé služby, jako jsou SID_SMyService a SID_SYourService, mohou určit použití stejného rozhraní, i když implementace rozhraní nemusí mít nic společného mezi těmito dvěma službami. Tento přístup funguje, protože volání QueryService (SID_SMyService, IID_IDispatch) může vrátit jiný objekt než QueryService (SID_SYourService, IID_IDispatch). Identita objektu se nepředpokládá při zadání jiného identifikátoru služby.

Viz také

Makra