Поделиться через


Метод IRegisterServiceProvider::RegisterService (strmif.h)

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие 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 позволяет зарегистрировать службу с помощью диспетчера фильтров Graph. Затем другие объекты могут использовать интерфейс 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();
    }
};
Чтобы отменить регистрацию службы, вызовите RegisterService с указателем NULL во втором параметре:
C++
pRSP->RegisterService(SID_MyService, NULL);
При выпуске диспетчера фильтров графов отменяется регистрация всех служб.

Диспетчер фильтров графов сохраняет количество ссылок в объекте службы до тех пор, пока служба не будет отменена. Чтобы предотвратить число циклических ссылок, объект службы не должен содержать счетчик ссылок в диспетчере фильтров графов. Например, нельзя использовать метод деструктора объекта службы для отмены регистрации службы, так как до тех пор, пока служба содержит счетчик ссылок в диспетчере фильтров графов, деструктор никогда не будет вызываться. Одним из решений является создание отдельного объекта, который регистрирует и отменяет регистрацию службы. Или можно просто освободить объект службы после его регистрации и позволить диспетчеру фильтров Графа управлять его временем существования.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header strmif.h (включая Dshow.h)
Библиотека Strmiids.lib

См. также раздел

Коды ошибок и успешности

Интерфейс IRegisterServiceProvider