Я разрабатываю приложение формы Windwos, используя Directshow.
При запуске я использовал Quarts.dll, расположенный в windows / system32, чтобы получить базовый API Directshow.
Через некоторое время я понял, что мне нужен весь API Directshow, потому что мне нужно создать новый фильтр Video Renderer (VM7).
Для этого мне нужно иметь доступ к некоторым интерфейсам, представленным в Directshow c ++ API.
Я обнаружил, что Directshow является COM-компонентом, и я могу получить доступ к его API в C #, если найду правильный способ связать его.
Вот что я сделал, чтобы получить доступ к API:
Я обнаружил, что C ++ API предоставляется в Windows SDK. API, который мне нужен, находится в devenum.idl, axcore.idl и axextend.idl.
Это файлы языка описания интерфейса, и я обнаружил, что могу использовать midl.exe через cmd для создания файла .tlb (typelib), теперь с помощью файла я могу получить доступ к нужным интерфейсам. Но чтобы использовать мидл-компилятор, мне нужно было создать новый .idl-файл, содержащий нужные мне интерфейсы, это выглядит так:
import "devenum.idl";
import "axcore.idl";
import "axextend.idl";
[
uuid(A68F9934-FDB9-4AAE-A631-F9307171B2FA),
helpstring("DirectShow interfaces")
]
library DirectShow
{
interface IFilterGraph;
interface ICreateDevEnum;
interface IGraphBuilder;
interface ICaptureGraphBuilder2;
interface IFileSinkFilter;
interface IFileSinkFilter2;
interface IAMAudioInputMixer;
};
Это необходимо для создания нового руководства.
После этого я смог запустить midl и создать файл .tlb, но когда я попытался добавить ссылку на файл .tlb, он выдал ошибку.
Я нашел способ создать файл .dll из этого файла .tlb, запустив tlbimp.exe через cmd для файла .tlb. Он создал .dll, который мне удалось добавить в мой проект.
Теперь Visual Studio знает, как взаимодействовать со всеми интерфейсами, которые я пытался получить.
Но для проблемы, с которой я сталкиваюсь сейчас:
Во время выполнения я получаю эту ошибку:
Получение фабрики классов COM для компонента с CLSID {56A868A9-0AD4-11CE-B03A-0020AF0BA770} не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Я вижу, что компонент clsid проблемы — это не clsid библиотеки в созданном мною файле .idl, это может свидетельствовать о том, что проблема связана с файлами импорта, которые я использую, возможно, неправильный указатель в этих файлах?
Я также думаю, что проблема может быть в том, что .dll не зарегистрирован в моей системе. Я пытался использовать regsvr32, но он дал мне ошибку, говоря:
Модуль «directshow.dll» был загружен, но точка входа DLLRegisterServer не найдена …
Теперь кто-нибудь, пожалуйста, спасите меня и скажите мне, как решить проблему или предложите мне другое решение использования API C ++ от Directshow через c #.
У вас будут трудности с интерфейсом DirectShow API из кода C # напрямую. К счастью, эта работа уже сделана и доступна как DirectShow.NET Library. Он поставляется со всеми необходимыми привязками и примерами проектов.
Именно эта ошибка
Получение фабрики класса COM для компонента с CLSID
{56A868A9-0AD4-11CE-B03A-0020AF0BA770} не удалось из-за следующих
ошибка: 80040154 Класс не зарегистрирован (Исключение из HRESULT:
0x80040154 (REGDB_E_CLASSNOTREG)).
говорит, что вы пытаетесь использовать IGraphBuilder
идентификатор интерфейса IID
как идентификатор класса CLSID
, Это, как ожидается, не сработает.
Других решений пока нет …