Как получить имя устройства с известным идентификатором класса?

StackOverflow https://stackoverflow.com/questions/2351872

  •  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, чтобы предоставить контекст для операций, связанных с этим моникером.

При этом, Аддсаурцефилтерформоникер Метод ничем не отличается, поскольку вы не передаете контекст привязки для моникера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top