4

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 を使用する別の解決策を提案してください。

4

1 に答える 1

3

C#コードからDirectShowAPIを直接インターフェースするのに苦労するでしょう。幸い、この作業はすでに完了しており、DirectShow.NETライブラリとして利用できます。必要なすべてのバインディングとサンプルプロジェクトも付属しています。

具体的にはこのエラー

CLSID {56A868A9-0AD4-11CE-B03A-0020AF0BA770}のコンポーネントのCOMクラスファクトリの取得は、次のエラーのために失敗しました:80040154クラスが登録されていません(HRESULTからの例外:0x80040154(REGDB_E_CLASSNOTREG))。

IGraphBuilderインターフェイス識別子IIDをコクラス識別子として使用しようとしていることを示しますCLSID。これは予想通りうまくいきません。

于 2012-09-27T11:00:22.343 に答える