Método IRegisterServiceProvider::RegisterService (strmif.h)
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
O RegisterService
método registra um objeto como um serviço.
Sintaxe
HRESULT RegisterService(
[in] REFGUID guidService,
[in] IUnknown *pUnkObject
);
Parâmetros
[in] guidService
SID (identificador de serviço) do serviço.
[in] pUnkObject
Ponteiro para a interface IUnknown do objeto de serviço ou NULL para cancelar o registro do serviço.
Retornar valor
Retorna um valor HRESULT .
Comentários
Um serviço é uma interface que um cliente descobre por meio do método COM IServiceProvider::QueryService , em vez de por meio do método IUnknown::QueryInterface usual. A diferença entre os dois métodos é que QueryInterface retorna uma interface no objeto original, enquanto QueryService pode retornar uma interface em outro objeto. (Mais precisamente, QueryInterface garante que você pode consultar a interface original e a interface retornada para IUnknown, e você receberá de volta ponteiros idênticos. QueryService não tem essa garantia.)
O RegisterService
método permite que você registre um serviço com o Gerenciador de Grafo de Filtro. Em seguida, outros objetos podem usar a interface IServiceProvider para recuperar seu objeto. Isso facilita a comunicação entre objetos COM separados, usando o Gerenciador de Grafo de Filtro como o ponto de comunicação central.
Um serviço é identificado por um GUID, chamado SID (identificador de serviço). Um serviço pode dar suporte a várias interfaces. Para registrar o serviço, chame RegisterService
, conforme mostrado no seguinte código:
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
com um ponteiro NULL no segundo parâmetro:C++ |
---|
pRSP->RegisterService(SID_MyService, NULL); |
O Gerenciador de Grafo de Filtro mantém uma contagem de referência no objeto de serviço até que o serviço não seja registrado. Para evitar contagens de referência circulares, o objeto de serviço não deve conter uma contagem de referência no Gerenciador de Grafo de Filtro. Por exemplo, você não pode usar o método destruidor do objeto de serviço para cancelar o registro do serviço, pois enquanto o serviço mantiver uma contagem de referência no Gerenciador de Grafo de Filtro, o destruidor nunca será chamado. Uma solução é criar um objeto separado que registre e cancele o registro do serviço. Ou, você pode simplesmente liberar o objeto de serviço depois de registrá-lo e permitir que o Gerenciador de Grafo de Filtro controle seu tempo de vida.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | strmif.h (inclua Dshow.h) |
Biblioteca | Strmiids.lib |