トラブルシューティングのヒント

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

この次のヒントは、DirectShow アプリケーションでデッドロックやクラッシュを回避するのに役立ちます。

グローバル オブジェクト

グローバル C++ オブジェクトは、コンストラクター メソッドで DirectShow オブジェクトを作成したり、デストラクター メソッドで解放したりしないでください。 これを行うと、次の理由により、アプリケーションが無期限にブロックされる可能性があります。

DLL のエントリ ポイント関数内でスレッドを終了することはできません。 カーネル 32 は、エントリ ポイント関数中にグローバル プロセス ロックを保持し、ロックによってスレッドが終了するのを防ぎます。 一部の DirectShow オブジェクトはスレッドを所有しているため、DLL エントリ ポイント関数内から解放された場合はブロックできます。 アプリケーションにグローバル C++ オブジェクトがある場合、C ランタイム DLL は DLL のアンロード時にオブジェクトのデストラクターを呼び出します。 デストラクターが DirectShow オブジェクトを解放すると、結果としてブロックされる可能性があります。

同様の理由から、DLL はエントリ ポイント ルーチンで DirectShow オブジェクトを作成または解放しないでください。

インターフェイスの解放

アプリケーションがメッセージ ループを終了する前に、メッセージの処理中にすべての DirectShow インターフェイス ポインターを解放する必要があります。 それ以外の場合は、一部の DirectShow オブジェクトがクリーンのルーチン中にメッセージを送信するため、さまざまなアサートが表示されることがあります。

(併置として、ATL CWindowImpl クラスを使用している場合は、 OnFinalMessage がインターフェイスを解放するまで待つ必要はありません。代わりに、WM_CLOSE メッセージを処理するときに解放します。

参照カウント

Quartz.dllのデバッグ バージョンがアンロードされると、DirectShow オブジェクトにリリースされなかった参照カウントがあるかどうかを確認します。 その場合は、アサーションがスローされます。

g_cFGObjects == 0 

このアサーションが失敗すると、アプリケーションが参照カウントをリークしたことを意味します。 コードを確認し、すべてのインターフェイス ポインターを解放していることを確認します。

DirectShow でのデバッグ