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();
}
In questo esempio si presuppone che MyCreateServiceHelper sia una funzione helper che crea l'oggetto servizio. Un client potrebbe ottenere un puntatore all'oggetto servizio chiamando IServiceProvider::QueryService:
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();
    }
};
Per annullare la registrazione del servizio, chiamare RegisterService con un puntatore NULL nel secondo parametro:
C++
pRSP->RegisterService(SID_MyService, NULL);
Quando viene rilasciato Filter Graph Manager, annulla la registrazione di tutti i servizi.

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

Vedi anche

Codici errore e esito positivo

Interfaccia IRegisterServiceProvider