[英]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.