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();
}
Este exemplo pressupõe que MyCreateServiceHelper é uma função auxiliar que cria o objeto de serviço. Um cliente pode obter um ponteiro para o objeto de serviço chamando 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();
    }
};
Para cancelar o registro do serviço, chame RegisterService com um ponteiro NULL no segundo parâmetro:
C++
pRSP->RegisterService(SID_MyService, NULL);
Quando o Gerenciador de Grafo de Filtro é lançado, ele cancela o registro de todos os serviços.

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

Confira também

Códigos de erro e êxito

IRegisterServiceProvider Interface