【问题标题】:Can I load a dll in such a way that it can be deleted while it's loaded?我可以以在加载时可以删除的方式加载 dll 吗?
【发布时间】:2011-11-24 16:54:19
【问题描述】:

标题几乎说明了一切..

我想做的是编写一个工具来监控一个包含插件的 dll 文件,当我覆盖它时,通过重新编译,它应该会自动重新加载它。 我知道我可以制作副本、加载副本并监控原件,但我认为可能有更好的方法.. 如果我理解正确,则 dll 已完全加载到内存中,因此删除文件应该没有问题..

【问题讨论】:

    标签: c++ c windows winapi dll


    【解决方案1】:

    不,这不是 Windows 的工作方式。加载 DLL 只会创建一个内存映射文件,除了重定位(如有必要)之外,实际上不会从文件中读取任何内容。直到您的代码调用导出的函数。这会导致页面错误,因为代码尚未加载。现在代码从文件中读取到 RAM 中。如果其他进程需要空间,那么页面就会被取消映射。在下一页错误时再次重新加载。

    MMF 对文件进行了硬锁定。您只能重命名它,不能覆盖或删除它。那会使程序崩溃。使用 FreeLibrary() 释放锁。

    【讨论】:

      【解决方案2】:

      还没有尝试过,我现在不在我的 Windows 机器上,但我认为 Windows 在加载 DLL 时会锁定文件以防止写入。您应该首先检查一下,您是否真的会覆盖 DLL(例如通过编译新版本)或者编译器是否会抱怨“权限被拒绝”。

      否则我想你可以使用file change notification API 来实现你的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2014-11-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 2016-02-27
        相关资源
        最近更新 更多