Как получить моникер устройства с известным идентификатором класса? - PullRequest
1 голос
/ 28 февраля 2010

Я использую 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 Ответ

1 голос
/ 28 февраля 2010

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

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

...