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