カスタム DirectShow 変換フィルターを作成して登録し、DLL にエクスポートすることができました。GraphEdit と C++ テスト プログラムの両方で正しく動作するようになりました。私の次の目標は、テスト アプリまたは GraphEdit のプロパティ ページから、フィルターのメイン パラメーターを制御するカスタム インターフェイスを作成することです。
これらの指示に従って、カスタム インターフェイスが C++ テスト プログラムから適切に動作するようになりました。ただし、プロパティ ページで問題が発生しています。GraphEdit で「要求されたプロパティ ページを表示できませんでした」というエラー メッセージが表示され続けます。
デバッグ中に、(CBasePropertyPage から派生したカスタム プロパティ ページ クラスで) 呼び出される唯一のメソッドがOnConnect()
and OnDisconnect()
- であることがわかりました。これら 2 つのメソッドの間で、いくつかの呼び出しが CBasePropertyPage メソッド (基本クラスの cprop.cpp ファイル) に対して行われ、次のようになるまですべてが正常に見えます。
STDMETHODIMP CBasePropertyPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)
より正確には
m_hwnd = CreateDialogParam(g_hInst, MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM) this);
私は常にm_hwnd
0 になるため、メソッドはエラーを返します。GetLastError()
この命令の直後に追加しようとしましたが、常に 0 が返され、エラーは発生しません。さらに、のすべてのパラメータはCreateDialogParam()
適切に初期化されているように見えます...
どんな助けでも大歓迎です!
編集:
今のところ、少なくとも実用的な例を得るために、 MSDN チュートリアルで説明されているものと同じリソース/テンプレートを使用しました。
---編集 2--- :
もう少しデバッグしながら、Dialog リソースからすべてのコントロール (ボタン、スクローラー) を削除してみました。その後...すべてが機能します。CreateDialogParam()
正しい値を返し、私のクラスOnActivate()
が呼び出されます。最終的に、GraphEdit に「フィルター プロパティ」ページが表示されますが、空です (既定のダイアログ ウィンドウを除く)。
しかし、MF コマンド ボタンなどのコントロールを使用するとすぐに、以前の問題が発生します。
DirectShow の基本クラスと私が使用しているコントロールとの間に何らかの非互換性はありますか? (もしそうなら、提供されたサンプルで何も言及されていないのはなぜですか?) プロパティ ページにコントロールを追加する簡単な方法はありますか?
(私は間違いなく、GUI と Win32 コントロールの専門家ではありません...)