2

DirectShow CSource キャプチャ フィルターを開発しています。正常に動作しますが、フィルターを使用しているプログラムを閉じると (この場合は VLC でテストしていますが、他のプログラムでも同じことが起こります)、プログラムがクラッシュします (Visual Studio でデバッグしている場合は、ブレークポイントがトリガーされます)。

この問題をしばらく探していたところ、ソース フィルターとソース ストリームの両方が解放されていないことがわかりました。つまり、それらの参照カウンターはプログラムの最後で 1 であり、DllCanUnloadNow() 関数は 2 つのオブジェクトがまだ使用中であることを報告し、CoUninitialize() が呼び出されるとプログラムがクラッシュします。

基本クラスの実装を使用しているため、参照カウンターが正しく処理されていると確信しています。私のソフトウェアで考えられる唯一の異常な点は、私が独自のバージョンの DllGetClassObject() を使用していることです: DllGetClassObject() の代わりに MyDllGetClassObject() をエクスポートするように .DEF ファイルを構成しました。デフォルトの実装を呼び出します。MyDllGetClassObject() の最後に返されるすべてのオブジェクトの参照カウンターが 1 であることを確認したので、これは問題ではないと思います。

フィルターのライフサイクルについて何かが欠けていると思いますが、何がわかりません (これは私が開発している最初のキャプチャ フィルターです)。なにか提案を?

前もって感謝します、

ギレルモ

4

1 に答える 1

1

私はついに何が起こっているのかを理解しました。ソース フィルターの静的メソッドは、プロセスのシャットダウン時にInitializeInstance呼び出されbLoading == falseます。rclsid == <the GUID of my filter>これは、フィルター インスタンスから残りの参照カウンターを解放する適切な場所のようです。

少し前にすべての COM オブジェクトを解放することがいかに重要であるかについての重要なアイデアは、CoUninitializeStackOverflow に関する別の投稿「DirectShow code crashes after exit (PushSourceDesktop sample) 」というタイトルのものから得ました。私に必要だったのは、DirectShow フィルターのライフサイクルに関する知識が少し増えたことだけでした。

とにかく、あなたの努力に感謝します、ローマン、私はこのスレッドが最初からどれほど曖昧に聞こえたかを知っています:)

于 2012-09-11T07:36:06.693 に答える