私はちょうど、LoadLibrary
API呼び出しを使ってロードされたDLLファイルがロードされている間に名前が変更されたという驚くべきバグがありました。どうやら、ファイルに開いているDLLハンドルを持っていても、そのファイルの名前が変更されたり、別のパスに移動したりすることはありません。しかし、削除から保護され、別のディスクに移動されます。この場合、DLL を使用しているプログラムは、引き続き正常に動作します。 ProcessExplorerは、DLLハンドルのパスがそれに応じて更新されることを示します。オープンされたDLLハンドルがファイルの移動を保護しないのはなぜですか?
この動作は、Windowsの通常のファイルハンドルと異なります。たとえば、開いているstd::ifstream
を同じDLLに保つと、名前変更はオペレーティングシステムによって許可されなくなります。私はこの行動が非常に驚くべきものだと誰もそれを説明することができますか?特に、私はディスク上のファイルの追跡が単にそれを固定するよりも難しいと想像していたので、これを許す根拠に興味があります。したがって、OSはおそらくこの機能を積極的にサポートしなければならないでしょう。つまり、そのためのユースケースが必要です。
これは理にかなっています。実際には、dllのファイルハンドルはロード後に閉じられ、メモリマッピングだけが存続します。また、['CreateFile']のオプションとして' FILE_SHARE_DELETE'を指してくれてありがとう(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) 、私はその前にそのオプションを知らなかった。 – ComicSansMS