Directshow を使用して Windwos フォーム アプリケーションを開発しています。最初は、Directshow の基本的な API を取得する目的で、windows/system32 にある Quarts.dll を使用していました。しばらくして、新しいビデオ レンダラ フィルタ (VM7) を作成する必要があるため、Directshow の API 全体が必要であることに気付きました。これを行うには、Directshow C++ API で提供されるいくつかのインターフェイスにアクセスする必要があります。Directshow は COM コンポーネントであり、適切なバインド方法を見つければ、C# で彼の API にアクセスできることがわかりました。
さて、これはAPIにアクセスするために私がしたことです:
C++ API が Windows SDK で提供されていることがわかりました。必要な API は、devenum.idl、axcore.idl、および axextend.idl にあります。
これらはインターフェイス記述言語ファイルであり、cmd を介して midl.exe を使用して .tlb ファイル (typelib) を作成できることがわかりました。ファイルの助けを借りて、必要なインターフェイスにアクセスできるようになりました。しかし、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 ファイルの cmd を介して tlbimp.exe を実行することにより、この .tlb ファイルから .dll ファイルを作成する方法を見つけました。プロジェクトに追加することに成功した.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 を使用する別の解決策を提案してください。