微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

windows – 为什么打开的DLL句柄不能保护文件不被移动?

我刚刚遇到一个令人惊讶的错误,其中使用 LoadLibrary API调用加载的DLL文件在加载时被重命名.显然,在文件上使用打开的DLL句柄不会阻止重命名文件,甚至不会将其移动到其他路径.但是,它可以防止删除并移动到其他磁盘.如果发生这种情况,使用DLL的程序继续正常工作. ProcessExplorer显示DLL处理的路径相应地更新.

此行为与Windows中的普通文件句柄不同.例如,在将std :: ifstream打开到同一DLL时,操作系统不再允许重命名.我发现这种行为非常令人惊讶,并且想知道是否有人可以给出解释呢?特别是我对允许这样做的理由感兴趣,因为我认为跟踪磁盘上的文件比将其锁定到位更困难.所以操作系统可能必须积极支持这个功能,这意味着必须有一个用例呢?

解决方法

这不是一个bug. LoadLibrary使用 File Mapping访问文件.虽然您有一个映射到文件的部分,但它无法删除(或移动到另一个磁盘).似乎 LoadLibrary关闭一个文件句柄(它不需要)并且只使用映射部分的句柄,因此您可以自由地重命名文件但不能删除它.

另一方面,std :: ifstream使用文件句柄来访问文件.并且它不会设置重命名删除操作所需的FILE_SHARE_DELETE共享访问权限.

实际上,磁盘上没有特殊的文件跟踪.文件句柄指向文件,这就是全部.打开文件并获得其处理后,文件可以重命名甚至删除,您仍然可以访问该文件(如果文件已被删除,则可以访问受限文件,但您可以取消删除文件并拥有完全访问权限) .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐