1

DirectShow の薄いラッパーである DirectShowLib を使用しています。BDA デバイスの列挙とその CLSID の収集に成功しました。ユーザーが名前でデバイスを選択し、選択した CLSID がわかっている場合、このデバイスをフィルター グラフに追加する必要があります。

私は次のことをしました:

Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);

ここで問題は、デバイスで取得したオブジェクトの種類は何ですか? デバッガーは、それが有効な Com オブジェクトであることを示しています。IBaseFilter にキャストしようとすると、「そのようなインターフェイスはサポートされていません」という例外が発生します。IMoniker に正常にキャストできます。しかし、次のことをしようとすると:

int hr = graphBuilder.AddSourceFilterForMoniker(
    device, null, filtername, out receivedFilter);

エラーが発生します:

HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX

メソッド AddSourceFilterForMoniker は、列挙の直後に使用すると正常に機能することがわかっているため、モニカーを正しく作成していないようです。

クラス ID がわかっている場合、モニカー オブジェクトを作成する正しい方法は何ですか? AddSourceFilterForMoniker に渡すことができますか?

4

1 に答える 1

1

推測ですが、 IBindCtx実装を作成していないようです。私が確認したIMonikerに関連するすべての操作では、モニカーに関連する操作のコンテキストを提供するために、IBindCtx 実装を渡す必要があります。

そうは言っても、モニカーのバインド コンテキストを渡さないという点で、 AddSourceFilterForMonikerメソッドも同じです。

于 2010-02-28T18:15:50.960 に答える