簡體   English   中英

使用DirectShow c ++的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文件,它看起來像這樣:

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的不同解決方案。

您將很難直接從C#代碼連接DirectShow API。 幸運的是,這項工作已經完成並可作為DirectShow.NET庫使用 它附帶了您需要的所有綁定以及示例項目。

特別是這個錯誤

由於以下錯誤,檢索具有CLSID {56A868A9-0AD4-11CE-B03A-0020AF0BA770}的組件的COM類工廠失敗:80040154未注冊類(HRESULT異常:0x80040154(REGDB_E_CLASSNOTREG))。

告訴您正在嘗試使用IGraphBuilder接口標識符IID作為coclass標識符CLSID 這預計不會奏效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM