将DirectShow c \\’s API与C#(COM组件)一起使用

Using DirectShow c++'s API with C# (COM component)

我正在使用Directshow开发Windwos表单应用程序。
开始时,我使用位于Windows / system32中的Quarts.dll来获取Directshow的基本API。
不久之后,我意识到我需要Directshow的整个API,因为我需要创建一个新的Video Renderer过滤器(VM7)。
为此,我需要访问Directshow c API中提供的某些接口。
我发现Directshow是一个COM组件,如果我找到了绑定它的正确方法,就可以用C#访问他的API。

现在,这是我访问API的步骤:

我发现Windows SDK中提供了C API。我需要的API位于devenum.idl,axcore.idl和axextend.idl中。

这些是界面描述语言文件,我发现可以通过cmd使用midl.exe创建.tlb文件(类型库),现在有了该文件的帮助,我可以访问所需的接口。但是要使用Midl编译器,我需要创建一个包含所需接口的新.idl文件,该文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
};

这需要创建一个新的Guid。

之后,我能够运行midl并创建一个.tlb文件,但是当我尝试添加对.tlb文件的引用时,出现了错误。

我找到了一种通过从.tlb文件中的cmd运行tlbimp.exe来从此.tlb文件中创建.dll文件的方法。它创建了一个.dll,我成功将其添加到项目中。
现在Visual Studio知道如何与我试图获取的所有接口进行交互了。

但是对于我现在面临的问题:

在运行时出现此错误:

由于以下错误,检索具有CLSID {56A868A9-0AD4-11CE-B03A-0020AF0BA770}的组件的COM类工厂失败:80040154未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))。

我可以看到问题的组件clsid不是我创建的.idl文件中库的clsid,它可以证明问题出在我正在使用的导入文件上,也许是那些文件中的向导不正确?

我还认为问题可能是该.dll未在我的系统上注册。我尝试使用regsvr32,但它给了我一个错误,说:

已加载模块" directshow.dll",但未找到入口点DLLRegisterServer ...

现在有人请救救我,并告诉我如何解决该问题,或者向我建议通过c#使用Directshow的C API的其他解决方案。


您将很难直接从C#代码连接DirectShow API。幸运的是,这项工作已经完成,可以作为DirectShow.NET库使用。它带有您需要的所有绑定以及示例项目。

具体是此错误

Retrieving the COM class factory for component with CLSID
{56A868A9-0AD4-11CE-B03A-0020AF0BA770} failed due to the following
error: 80040154 Class not registered (Exception from HRESULT:
0x80040154 (REGDB_E_CLASSNOTREG)).

告诉您正在尝试使用IGraphBuilder接口标识符IID作为共同类标识符CLSID。预期这将无法解决。