3

シェルの名前空間拡張は非常に複雑です。過去 10 年間、シェルの名前空間拡張機能を構築してきました。その最新版が MagicRAR (www.magicrar.com) のアーカイブ フォルダ機能です。

残念ながら、非常に慎重にコーディングし、スレッドが共有メモリに適切にアクセスできるようにしているにもかかわらず、シェルの名前空間拡張機能を使用すると、クラッシュが発生することがあります。Explorer ホスト プロセスは、シェル名前空間拡張の使用中または使用外でクラッシュします。

AQTime Pro などのさまざまなツールを使用して、シェル名前空間拡張コードのトラブルシューティングを行いました。メモリの上書きやその他の同様のアクセスの問題は報告されていません。これにより、問題が 1 つだけ残ります。VCL はスレッド セーフではありません!

実際、VCL をシェル名前空間拡張の一部として使用しています。Explorer のファイル リストは、実際にはホストされたコントロールであり、独自のシェル名前空間拡張の場合は、実際には VCL ウィンドウです。そもそもこれが許可されたシナリオであるかどうかは、(複数世代の開発の後)疑問に思っています...

メイン アプリケーション オブジェクトは、シェル名前空間拡張 DLL にも存在しません。メイン VCL スレッドがどこにも作成されていないため、TThread.Synchronize を使用すると Explorer がデッドロックします。メインの VCL スレッドを手動で作成する必要がありますか (どのように?) - おそらく別の DLL 内で - その DLL を介してすべての UI の作成/更新/破棄を再ルーティングしますか?

Explorer には、VCL ウィンドウを含む任意の数のウィンドウが表示される場合があることに注意してください。Explorer は、ターゲット システムの構成に基づいて、複数の独立したプロセスとして、または単一のプロセスとして実行されている場合もあります。

私たちのシェル名前空間拡張は、John Lam の出発点に基づいています (ほとんどの Delphi シェル名前空間開発者は知っているでしょう)。もちろん、最終製品でわかるように、この出発点には大幅な変更が加えられています。John Lam は、VCL がスレッドセーフではないという問題について、スライドやサンプル プロジェクトで一度も議論していません。

また、過去 10 年間にわたり、ShellPlus コンポーネントの複数のバージョンを使用しようと試みてきました。彼らはいくつかの優れた仕事をしましたが、残念ながら、私たちの経験では、彼らのコードに基づく非常に初歩的な取り組みでさえ、私たち自身のコードよりもはるかに悪い結果をもたらしました.

ShellPlus は実際には、カスタム VCL ウィンドウを作成する代わりに、Explorer 独自の定義済みホスト ウィンドウを使用する機能も提供します。これにより、VCL のスレッド化の問題を回避できる可能性がありますが、私たちの経験では、これでさえ実行可能な解決策ではありませんでした。これは、VCL がウィンドウ化されているかどうかにかかわらず、ShellPlus シェル名前空間の拡張は常に自作のコードよりも安定性が低いためです。

何よりもまず; この質問は理論的なものです。エクスプローラー内の VCL ウィンドウをプロセス ホストとして使用するシェル名前空間拡張で VCL を使用できますか?

もしそうなら、このシナリオで VCL スレッドセーフレスの問題はどのように処理されますか?

4

2 に答える 2

4

VCL は確かにスレッドセーフではありません。VCL アプリケーションの外部で実行しても、そのルールから解放されるわけではありません。メインの VCL スレッドがないことは、状況を悪化させるだけです。VCL コントロールは、メイン スレッドのコンテキストで実行されることを想定しており、一般に、そのようなスレッドは存在せず、存在することもできません。使用しているコントロールは、同期保護なしでさまざまなグローバル変数にアクセスします。VCL コントロールが使用するすべてのユニットにパッチを適用する以外にできることはありません。

エクスプローラー内でウィンドウを作成および操作するには、VCL 関数ではなく、通常の Windows API 手法を使用します。


通知されたときに何かがキューをチェックすることを確認することで、同期のハングを解決できますが、「メイン」スレッドがないと、とにかく同期するSynchronize対象が明確ではないため、ジョブに適したツールではない可能性があります.

于 2013-02-28T05:01:15.940 に答える
0

私たちはついにこの問題を解決することができました。固定シェル名前空間拡張機能は、次の MagicRAR 9.0 で取り上げられます。問題は確かに VCL にありました。それ以外の場合、コードは完全に問題ありませんでした。Delphi でシェル名前空間拡張機能を構築しようとしている他の人のために:

はい、Delphi でシェル名前空間拡張を構築できます。しかし - VCL を使用している場合、数え切れないほどのランダムなクラッシュと不安定性が発生します。そして - VCL を使用していない場合、Delphi を使用する意味はほとんどありません。良いニュースは、VCL ソースにパッチを適用する必要がないことです。専用の VCL スレッドを使用するだけです。

于 2013-05-28T14:05:28.760 に答える