我正在使用 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 的不同解决方案。