Makra map služeb
Tato makra definují mapy a položky služeb.
Název | 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:
SERVICE_ENTRY_CHAIN dá pokyn IServiceProviderImpl::QueryService, aby řetězil jiný zadaný objekt.
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í.
Návratová 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í QueryService
př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í
QueryInterface
nemusí 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.