如何解决关闭由LoadLibrary打开的DLL文件句柄
如何在保持库加载的同时关闭通过.dll上的LoadLibrary
调用打开的文件句柄?例如FreeLibrary
无效。
对于我来说,有一个我想保持打开状态的程序,该程序具有DLL打开的功能,但是我不想每次重新编译并替换DLL时都关闭该程序。我不在乎程序是否在内存中有旧版本的库。 DLL也被另一个程序使用,这就是为什么我希望能够替换它。
解决方法
这是不可能的,因为“已加载”的DLL是内存映射文件。这意味着“关闭句柄”会将其从内存中删除,因为它不会被复制到内存中,只会被映射到。
这就是为什么DLL具有如此高的内存效率的原因,因为所有程序都使用完全相同的文件-它(几乎)不需要花费任何额外的内存来加载它数百次! (以防万一:将其映射为写时复制,因此在内存中进行修改不会修改磁盘上的文件,而是将一个受影响的4k页面复制到实际内存中并在其中进行修改。)
但是,您可以在文件仍在使用时重命名文件(或移动它,只要它在同一卷上,从技术上讲,这也是重命名操作)。然后,您可以创建一个具有原始名称的新文件,然后在将旧文件卸载到各处后删除旧文件。
您也可以使用MoveFileEx(MOVEFILE_DELAY_UNTIL_REBOOT)
将旧文件标记为在下次重新启动时自动删除,但这需要提升的特权。非高架更新程序/卸载程序通常选择的一种避免此情况的方法是,将批处理或vbs文件拖放到本地appdata文件夹中,该文件会先删除该文件,然后删除该文件本身(之所以起作用,因为脚本 复制到内存中),然后将其注册到每个用户的RunOnce
注册表项中。
(请注意,无法使用FILE_FLAG_DELETE_ON_CLOSE
打开文件。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。