Метод 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(); } |
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 |