Compartir a través de


Método IRegisterServiceProvider::RegisterService (strmif.h)

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

El RegisterService método registra un objeto como servicio.

Sintaxis

HRESULT RegisterService(
  [in] REFGUID  guidService,
  [in] IUnknown *pUnkObject
);

Parámetros

[in] guidService

Identificador de servicio (SID) del servicio.

[in] pUnkObject

Puntero a la interfaz IUnknown del objeto de servicio o NULL para anular el registro del servicio.

Valor devuelto

Devuelve un valor HRESULT .

Comentarios

Un servicio es una interfaz que un cliente detecta a través del método COM IServiceProvider::QueryService , en lugar de a través del método IUnknown::QueryInterface habitual. La diferencia entre los dos métodos es que QueryInterface devuelve una interfaz en el objeto original, mientras que QueryService puede devolver una interfaz en otro objeto. (Más precisamente, QueryInterface garantiza que puede consultar la interfaz original y la interfaz devuelta para IUnknown, y obtendrá punteros idénticos. QueryService no tiene esta garantía).

El RegisterService método permite registrar un servicio con el Administrador de gráficos de filtros. A continuación, otros objetos pueden usar la interfaz IServiceProvider para recuperar el objeto. Esto facilita la comunicación entre objetos COM independientes, mediante el Administrador de gráficos de filtros como punto de comunicación central.

Un servicio se identifica mediante un GUID, denominado identificador de servicio (SID). Un servicio puede admitir varias interfaces. Para registrar el servicio, llame a RegisterService, como se muestra en el código siguiente:

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();
}
En este ejemplo se supone que MyCreateServiceHelper es una función auxiliar que crea el objeto de servicio. Un cliente podría obtener un puntero al objeto de servicio llamando a 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 anular el registro del servicio, llame a RegisterService con un puntero NULL en el segundo parámetro:
C++
pRSP->RegisterService(SID_MyService, NULL);
Cuando se libera el Administrador de gráficos de filtros, anula el registro de todos los servicios.

Filter Graph Manager mantiene un recuento de referencias en el objeto de servicio hasta que el servicio no se registra. Para evitar recuentos de referencia circulares, el objeto de servicio no debe contener un recuento de referencias en el Administrador de gráficos de filtros. Por ejemplo, no puede usar el método destructor del objeto de servicio para anular el registro del servicio, ya que siempre que el servicio contenga un recuento de referencias en el Administrador de gráficos de filtros, nunca se llamará al destructor. Una solución consiste en crear un objeto independiente que registre y anule el registro del servicio. O bien, simplemente puede liberar el objeto de servicio después de registrarlo y dejar que el Administrador de graph de filtros controle su duración.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado strmif.h (incluya Dshow.h)
Library Strmiids.lib

Consulte también

Códigos de error y éxito

IRegisterServiceProvider (Interfaz)