Metodo IRegisterServiceProvider::RegisterService (strmif.h)
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Il RegisterService
metodo registra un oggetto come servizio.
Sintassi
HRESULT RegisterService(
[in] REFGUID guidService,
[in] IUnknown *pUnkObject
);
Parametri
[in] guidService
Identificatore del servizio (SID) del servizio.
[in] pUnkObject
Puntatore all'interfaccia IUnknown dell'oggetto servizio o NULL per annullare la registrazione del servizio.
Valore restituito
Restituisce un valore HRESULT .
Commenti
Un servizio è un'interfaccia individuata da un client tramite il metodo COM IServiceProvider::QueryService , anziché tramite il consueto metodo IUnknown::QueryInterface . La differenza tra i due metodi è che QueryInterface restituisce un'interfaccia nell'oggetto originale, mentre QueryService può restituire un'interfaccia su un altro oggetto. (Più precisamente, QueryInterface garantisce che sia possibile eseguire query sull'interfaccia originale e sull'interfaccia restituita per IUnknown e si otterranno puntatori identici. QueryService non ha questa garanzia.
Il RegisterService
metodo consente di registrare un servizio con Filter Graph Manager. Altri oggetti possono quindi usare l'interfaccia IServiceProvider per recuperare l'oggetto. Ciò facilita la comunicazione tra oggetti COM separati, usando Filter Graph Manager come punto di comunicazione centrale.
Un servizio viene identificato da un GUID, denominato SID (Service Identifier). Un servizio può supportare più interfacce. Per registrare il servizio, chiamare RegisterService
, come illustrato nel codice seguente:
C++ |
---|
DEFINE_GUID(SID_MyService, ....); IRegisterServiceProvider *pRSP; hr = pGraph->QueryInterface(IID_IRegisterServiceProvider, (void**)&pRSP); if (SUCCEEDED(hr)) { IUnknown pServiceObj; MyCreateServiceHelper(SID_MyService, &pServiceObj); pRSP->RegisterService(SID_MyService, pServiceObj); pRSP->Release(); pServiceObj->Release(); } |
C++ |
---|
IServiceProvider *pSP; hr = pGraph->QueryInterface(IID_IServiceProvider, (void**)&pSP); if (SUCCEEDED(hr)) { ISomeInterface *pService; hr = pSP->QueryService(SID_MyService, IID_ISomeInterface, (void**)&pService); pSP->Release(); if (SUCCEEDED(hr)) { pService->SomeMethod(); pService->Release(); } }; |
RegisterService
con un puntatore NULL nel secondo parametro:C++ |
---|
pRSP->RegisterService(SID_MyService, NULL); |
Filter Graph Manager mantiene un conteggio dei riferimenti sull'oggetto servizio fino a quando il servizio non viene registrato. Per impedire i conteggi dei riferimenti circolari, l'oggetto servizio non deve contenere un conteggio dei riferimenti in Filter Graph Manager. Ad esempio, non è possibile usare il metodo distruttore dell'oggetto servizio per annullare la registrazione del servizio, perché purché il servizio contenga un conteggio di riferimenti in Filter Graph Manager, il distruttore non verrà mai chiamato. Una soluzione consiste nel creare un oggetto separato che registra e annulla la registrazione del servizio. In alternativa, è possibile rilasciare semplicemente l'oggetto servizio dopo la registrazione e consentire al Filtro Graph Manager di controllare la durata.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [solo app desktop] |
Server minimo supportato | Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | strmif.h (include Dshow.h) |
Libreria | Strmiids.lib |