4

GetOpenFileName() を使用して標準の Windows の「ファイルを開く」ダイアログを使用すると、シェルは、カスタムのものを含め、ファイル リストを表示するために必要なさまざまな DLL をロードします。

私のアプリケーションでは、TortoiseCVS がアイコンにオーバーレイを描画するために使用する DLL が GdiPlusShutdown() を呼び出していることがわかりました。そのため、「ファイルを開く」ダイアログを表示した後、TortoiseCVS DLL がアンロードされ、GDI+ がシャットダウンされ、私のグラフィック関数はすべて失敗します!

基本的に、古い DLL がアプリケーションによっていつでもロードされ、その状態に対してランダムな処理を開始できるというのは、非常に悪いことのように思えます。私の場合の回避策は非常に簡単でした。GDI+ がシャットダウンされたことを検出した場合は、GDI+ を再起動するだけです。ただし、これがデバッグできないクライアントのマシンで発生した場合、何が起こっているのかを理解するのははるかに困難でした.

誰でも洞察を提供できますか?これが起こらないようにするにはどうすればよいですか?

4

1 に答える 1

1

私は、Dell が自社のマシン、特に wxVault に付けたがらくたに対処しなければなりませんでした。私の解決策は、コードに「単に」パッチを当てることでした。DEP では少し扱いに​​くいですが、それでも実行可能です。Microsoft Detours をのぞくことができます。これは、同じことを行うためのもう少し構造化された方法です。DLL はまだロードされていますが、少なくとも、呼び出してはならない関数の呼び出しを停止できます。

なぜ Windows がこのようにくだらないメカニズムを持っているのかについては、Raymond Chen の「Old New Thing」ブログまたは本を読んでください。

于 2008-09-18T14:48:17.297 に答える