0

Delphi Pro 6 と DSPACK ダイレクト ショー ライブラリで作成された DirectShow フィルタがあります。Windows XPで実行しています。DirectFilter のコンテナー クラスでコンストラクターが呼び出され、NIL を AOwner パラメーターとしてコンストラクターに渡し (TMyForm.Create(nil))、フォームの Show() メソッドを呼び出すときに、フォームを動的に作成しようとしました。フォームは表示されますしかし、それは決して再描画されず、入力に応答しないため、Windowsメッセージの受信を停止するように見えます.テストとして、私は自分のWndProc()を作成し、フォームのWndProc()をオーバーライドしようとしました.私のWndProc()は一度呼び出されましたが、二度と呼び出されませんでした. .

私は DLL であり、実行しているコンテキストがフォームのウィンドウ メッセージ ハンドラーに「友好的」ではないためだと思います。おそらく、それを呼び出すスレッドなどと関係があります。これを解決する方法や、DirectShow フィルターのコンテキストから永続的なウィンドウを作成する適切な方法について誰かが私にヒントを与えることができれば、私はそれを感謝します。前述したように、ウィンドウは永続的である必要があるため、フィルター プロパティ ページとして作成することはできません。

ありがとう、ロバート

4

1 に答える 1

1

DirectShow フィルタの詳細についてはお答えできませんが、ウィンドウとメッセージ処理に関する一般的な情報が役立つと思います。

ウィンドウにはスレッド アフィニティがあります。つまり、ウィンドウのすべてのメッセージは、それを作成したスレッドのコンテキストで処理されます。つまり、このスレッドには標準のメッセージ処理ループが必要であり、低レベルで に相当しApplication.ProcessMessages()ます。同じスレッドからのメッセージと他のスレッドからのメッセージの両方が、作成スレッドのメッセージ キューに入れられ、メッセージ ループがそれらを取得し、(オプションで) 変換し、ターゲット ウィンドウのウィンドウ ハンドラーにディスパッチします。

あなたが説明していることは、次のいずれかによって引き起こされる可能性があります

  • ウィンドウを作成するスレッドにメッセージ処理キューがない、または

  • 間違ったスレッドでウィンドウを作成する

(これらは本質的に同じであることに注意してください。しかし、このように述べると、これを引き起こすさまざまな問題が存在する可能性があることが明らかになり、さまざまな方法で修正する必要があります。ウィンドウを別のスレッドで作成するか、別の処理を行う必要があります。ループはスレッドで作成する必要があります。)

ウィンドウがメッセージを処理しない原因は 2 つのうちどれかを突き止める必要があります。必ずしもオーバーライドする必要はありませんWndProc()。異なるメッセージのメッセージ処理メソッドは同じように機能します (または機能しません)。同じWndProc()スレッドから送信されたメッセージは、状況によっては、ウィンドウ プロシージャを直接呼び出すことによって、メッセージ ループなしで処理されるため、一度呼び出されたというだけではあまりわかりません。

フィルターは DLL に常駐しているため、独自のメッセージ ループを作成するのは適切ではないと思います。これは、作成されるモーダル ダイアログに対して機能し、ダイアログが閉じられるまでメッセージ ループが実行され、メッセージ ループが終了して DLL 関数が返されます。メッセージループがまだ実行されている間に呼び出され、すべてを返す必要がある DLL エクスポート関数では機能しません。これらのフィルターを作成して呼び出すフレームワークは、メッセージ ループも処理すると思います。ただし、これは直感であり、DirectShow フィルターについて知らないと、間違っている可能性があります。

これをデバッグするのに役立つのは、Visual Studio の Spy++ のようなツールです。これを使用すると、ウィンドウに関する情報を表示したり、同じプロセスまたはスレッド内のウィンドウまたはすべてのウィンドウに送信されたメッセージをログに記録したり、ウィンドウ階層を表示したり、他の多くのことを行うことができます興味深いこと。それがない場合は、ネット上にたくさんのクローン (いくつかのフリーウェア) があるので、Google が見つけてください。同じスレッドまたはプロセスのすべてのウィンドウに送信されたメッセージを表示しようとすると、メッセージ ループが実行されているかどうかがわかります。SysInternals Process Explorer または同様のツールを実行して、詳細情報を取得することもできます。

于 2010-04-03T06:40:13.683 に答える