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

Я использую 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?

1 ответ

Решение

Просто предположение, но, похоже, вы не создаете реализацию IBindCtx. Все операции с IMoniker, которые я видел, требуют передачи реализации IBindCtx, чтобы обеспечить контекст для операций с моникером.

При этом метод AddSourceFilterForMoniker ничем не отличается в том смысле, что вы не передаете контекст связывания для моникера.

Другие вопросы по тегам