我是否可以以可以在加载时删除 dll 的方式加载它?
Can I load a dll in such a way that it can be deleted while it's loaded?
标题已经说明了一切。
我要做的是写一个工具,它将监视包含插件的dll文件,当我重写它时,通过重新编译,它应该自动重新加载它。我知道我可以制作一个副本,加载副本并监控原始版本,但我认为可能有更好的方法…如果我理解正确的话,dll是完全加载到内存中的,所以在删除文件时应该不会有问题。
不,Windows不是这样工作的。加载DLL只是创建一个内存映射文件,实际上除了重定位(如果需要的话)之外没有从文件中读取任何内容。除非您的代码调用导出函数。这会导致页面错误,因为代码尚未加载。现在,代码从文件中读取到RAM中。如果其他进程需要空间,那么页面就会被取消映射。在下一页重新加载错误。
MMF对文件加了一个硬锁。您只能重命名它,不能覆盖或删除它。那会使程序崩溃。使用FreeLibrary()释放锁
还没有尝试过,我现在不在我的Windows机器上,但我认为Windows在加载DLL时锁定了文件。你应该首先检查,你是否真的覆盖DLL(例如,通过编译一个新版本),或者编译器会抱怨"权限被拒绝"。
否则我想你可以使用文件更改通知API来实现你的目标。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 如何以编程方式查找加载的共享库的版本?
- 如果 QApplication 执行延迟,QWebEngineView 在加载内容时会以静默方式失败
- 如何以编程方式知道Adobe Reader完成了加载文件
- RedHatLinux :是否可以以编程方式加载 libcert.so 共享对象
- 加载到内存的文件的大小远大于其磁盘大小?!!任何压缩方式
- 我是否可以以可以在加载时删除 dll 的方式加载它?
- 为什么SDL不加载我的图像时,主应用程序通过快捷方式访问
- OpenGL -正确的方式来加载多面
- 改变加载资源的方式
- 如何从文本文件中只加载某些行,这取决于它们在C和c++中的开始方式