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

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

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

解决方法

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

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

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

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...