Как получить имя устройства с известным идентификатором класса?
-
23-09-2019 - |
Вопрос
Я использую DirectShowLib, который представляет собой тонкую оболочку для DirectShow.Я успешно перечислил устройства BDA и собрал их CLSID.Теперь, когда пользователь выбирает устройство по имени, и я знаю выбранный CLSID, мне нужно добавить это устройство в граф фильтров.
Я сделал следующее:
Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);
Теперь вопрос - что за объект у меня в устройстве?Отладчик показывает, что это действительный объект Com.Если я попытаюсь передать его в IBaseFilter, я получу исключение «Такой интерфейс не поддерживается».Я могу успешно передать его в IMoniker.Но тогда, если я попытаюсь сделать следующее:
int hr = graphBuilder.AddSourceFilterForMoniker(
device, null, filtername, out receivedFilter);
Я получаю сообщение об ошибке:
HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX
Я знаю, что метод AddSourceFilterForMoniker работает нормально, если я использую его сразу после перечисления, поэтому кажется, что я просто неправильно создаю моникер.
Как правильно создать объект моникера, если известен идентификатор класса, чтобы я мог передать его в AddSourceFilterForMoniker?
Решение
Просто предположение, но похоже, что вы не создаете IBindCtx выполнение.Все операции, связанные с IМоникер которые, как я видел, требуют передачи реализации IBindCtx, чтобы предоставить контекст для операций, связанных с этим моникером.
При этом, Аддсаурцефилтерформоникер Метод ничем не отличается, поскольку вы не передаете контекст привязки для моникера.