Использование DirectShow c ++ API с C # (компонент COM)

Я разрабатываю приложение формы 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 #.

4

Решение

У вас будут трудности с интерфейсом DirectShow API из кода C # напрямую. К счастью, эта работа уже сделана и доступна как DirectShow.NET Library. Он поставляется со всеми необходимыми привязками и примерами проектов.

Именно эта ошибка

Получение фабрики класса COM для компонента с CLSID
{56A868A9-0AD4-11CE-B03A-0020AF0BA770} не удалось из-за следующих
ошибка: 80040154 Класс не зарегистрирован (Исключение из HRESULT:
0x80040154 (REGDB_E_CLASSNOTREG)).

говорит, что вы пытаетесь использовать IGraphBuilder идентификатор интерфейса IID как идентификатор класса CLSID, Это, как ожидается, не сработает.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]