この問題の解決策を見つけるのに 4 時間近く費やしました。基本的に、Web カメラからのビデオを表示し、スナップショットを取り、Web カメラの解像度を変更できるDirectShowNetを使用して、C# でアプリケーションを作成しています。ウェブカメラのプラグが抜かれ、再び差し込まれたことを検出するデバイス マネージャーがあります。
最初に、FilterGraph オブジェクトを作成し、それを IFilterGraph3 にキャストします。次に、次の呼び出しを行います。
graphBuilder.AddSourceFilterForMoniker(deviceMoniker, null, deviceName, out sourceFilter)
この呼び出しは、最初にアプリケーションを起動したときに機能し、グラフを破棄して新しいグラフを作成した場合でも機能します。ただし、デバイスが再び接続された後にグラフを作成しようとするときだけは機能しません。
1 台のマシン (Win8 x64) で、次のエラーが表示されます。
REGDB_E_CLASSNOTREG - 0x80040154 - Class not registered
別のマシン (Win7 x64) で、次のエラーが表示されます。
REGDB_E_IIDNOTREG - 0x80040155 - Interface not registered
このコードをAny CPUおよびx86としてビルドする両方をテストしました。また、他のマシンでテストしましたが、OS とは関係なく、まだInterface not registeredエラーが発生します。Logitech C920とMicrosoft LifeCam Studioの両方を使用してみました。どちらも同じエラーになります。IMoniker メソッドを使用して、別の方法も試しました。
deviceMoniker.BindToObject(null, null, ref baseFilterId, out source);
同じエラーが発生します。デバイスが切断された後、グラフがソース (Webcam フィルター) を適切に取得できるようにクリーンアップしていないことが残っているように感じます。どんなアイデアでも大歓迎です。