アプリケーションで Web カメラから画像を取得するために、DirectShow フィルターグラフの基本的な実装に取り組んでいます。ドキュメントを読み、簡単な実装を作成しました。このグラフを作成します: device --> samplegrabber -> nullrenderer.
可能なすべての結果値をチェックしていますが、SDK からエラーは発生しません。
問題:
どういうわけか、コールバックは正しく呼び出されていますが、コールバック関数内にコードを追加するたびに (これは SampleCB と BufferCB の両方でカウントされます)、アプリケーションが静かにクラッシュします。
BufferCB にブレークポイントを追加しましたが、'this' が 0x0000000 / NULL であることがわかります。グラフを作成するときにすべての結果値をチェックするので、私の推測では、グラフの設定は正しく、この問題は COM に関連している可能性があります。しかし、これは単なる推測です。
Windows 7.0 SDK には、ISampleGrabber インターフェイスのインターフェイスを含む qedit.h が用意されていないため、このファイルを自分で作成し、関連するインターフェイスを追加しました (内容は、グーグル検索中に投稿のどこかにありました)。
ドキュメントから saveGraph 関数をコピーして、GraphEdit でグラフをテストできるようにしました。レンダー ノードを追加すると、自動的に色変換ノードが GraphEdit によって編集されることがわかります。レンダラーでグラフを実行すると、(graphedit で) Web カメラからの画像を見ることができます。
関連するすべてのコードをこの要点に貼り付けました (コールスタック トレース + 変数を含む)
これをデバッグする方法や、このエラーが何であるかを知っている人はいますか? COM関連でしょうか?
更新:私のメンバーにアクセスしようとしたときのコールスタック ISampleGrabberCB
ntdll.dll!_ZwRaiseException@12() + 0x12 bytes
ntdll.dll!_ZwRaiseException@12() + 0x12 bytes
msvcr100d.dll!__lock_fhandle(int fh) Line 467 C
qedit.dll!CSampleGrabber::Receive() + 0x18c bytes
qedit.dll!CTransformInputPin::Receive() + 0x33 bytes
quartz.dll!CBaseOutputPin::Deliver() + 0x22 bytes
quartz.dll!CVideoTransformFilter::Receive() + 0x1aa bytes
quartz.dll!CTransformInputPin::Receive() + 0x33 bytes
quartz.dll!CBaseInputPin::ReceiveMultiple() + 0x33 bytes
qcap.dll!COutputQueue::ThreadProc() + 0x103 bytes
qcap.dll!COutputQueue::InitialThreadProc() + 0x16 bytes
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
ありがとう