4

我正在使用 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 文件,其中包含我想要的接口,它看起来像这样:

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 文件创建 .dll 文件的方法,方法是通过 .tlb 文件上的 cmd 运行 tlbimp.exe。它创建了一个我成功添加到我的项目中的 .dll。现在 Visual Studio 知道如何与我试图获得的所有接口进行交互。

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

在运行时我收到此错误:

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

我可以看到问题的组件 clsid 不是我创建的 .idl 文件中库的 clsid,它可以证明问题出在我正在使用的导入文件上,可能是这些文件中的错误 guid?

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

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

现在有人请救救我,告诉我如何解决这个问题或建议我通过 c# 使用 Directshow 的 C++ API 的不同解决方案。

4

1 回答 1

3

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

特别是这个错误

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

告诉您正在尝试使用IGraphBuilder接口标识符IID作为 coclass 标识符CLSID。这预计不会奏效。

于 2012-09-27T11:00:22.343 回答