Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей 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 |