我刚刚遇到了一个令人惊讶的错误,其中使用LoadLibrary
API 调用加载的 DLL 文件在加载时被重命名。显然,在文件上打开 DLL 句柄并不能阻止该文件被重命名,甚至移动到不同的路径。但是,它受到保护,不会被删除并被移动到不同的磁盘。如果发生这种情况,使用 DLL 的程序将继续正常工作。ProcessExplorer 显示 DLL 句柄的路径会相应更新。
此行为不同于 Windows 中的普通文件句柄。例如,当保持std::ifstream
对同一个 DLL 的打开时,操作系统不再允许重命名。我发现这种行为非常令人惊讶,并且想知道是否有人可以对此做出解释?特别是我会对允许这样做的理由感兴趣,因为我认为跟踪磁盘上的文件比仅仅锁定它更困难。所以操作系统可能必须积极支持这个功能,这意味着它必须有一个用例吗?