IRegisterServiceProvider::RegisterService 方法 (strmif.h)

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

方法 RegisterService 将对象注册为服务。

语法

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

参数

[in] guidService

服务标识符 (服务的 SID) 。

[in] pUnkObject

指向服务对象的 IUnknown 接口的指针,或 指向 NULL 以取消注册服务。

返回值

返回 HRESULT 值。

注解

服务是客户端通过 COM IServiceProvider::QueryService 方法而不是通过常用的 IUnknown::QueryInterface 方法发现的接口。 这两种方法的区别在于 QueryInterface 返回原始对象上的接口,而 QueryService 可能返回另一个对象的接口。 (更确切地说, QueryInterface 保证可以查询 IUnknown 的原始接口和返回的接口,并且将返回相同的指针。 QueryService 没有此保证。)

方法 RegisterService 使你能够向 Filter Graph Manager 注册服务。 然后,其他对象可以使用 IServiceProvider 接口来检索对象。 这将使用筛选器关系图管理器作为中心通信点,从而促进单独的 COM 对象之间的通信。

服务由 GUID 标识,称为服务标识符 (SID) 。 一个服务可以支持多个接口。 若要注册服务,请调用 RegisterService,如以下代码所示:

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();
}
此示例假定 MyCreateServiceHelper 是创建服务对象的帮助程序函数。 客户端可以通过调用 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();
    }
};
若要注销服务,请在第二个参数中使用 NULL 指针调用 RegisterService
C++
pRSP->RegisterService(SID_MyService, NULL);
释放 Filter Graph 管理器后,它会取消注册所有服务。

Filter Graph 管理器会保留服务对象的引用计数,直到取消注册服务。 为防止循环引用计数,服务对象不应在 Filter Graph 管理器上保存引用计数。 例如,不能使用服务对象的析构函数方法取消注册服务,因为只要服务持有 Filter Graph Manager 上的引用计数,就永远不会调用析构函数。 一种解决方案是创建一个单独的对象来注册和取消注册服务。 或者,只需在注册服务对象后将其释放,并让筛选器关系图管理器控制其生存期。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 strmif.h (包括 Dshow.h)
Library Strmiids.lib

另请参阅

错误和成功代码

IRegisterServiceProvider 接口