代码之家  ›  专栏  ›  技术社区  ›  korri123

关闭LoadLibrary打开的DLL文件句柄

  •  1
  • korri123  · 技术社区  · 4 年前

    如何关闭由打开的文件句柄 LoadLibrary FreeLibrary 例如不会起作用。

    在我的例子中,有一个程序我想保持打开的DLL打开,但我不想每次重新编译和替换DLL时都关闭该程序。我不在乎程序内存中是否有旧版本的库。DLL也被另一个程序使用,这就是为什么我想能够替换它。

    1 回复  |  直到 4 年前
        1
  •  5
  •   CherryDT Ravi Shankar    4 年前

    这是不可能的,因为“加载的”DLL是一个内存映射文件。这意味着“关闭手柄”将从内存中删除它,因为它不是 只是为了记忆 .

    这就是为什么只要所有的程序都使用完全相同的文件,DLL的内存效率是如此之高——它(几乎)不需要任何额外的内存来加载它几百次!(以防您怀疑:它被映射为“写入时复制”,因此在内存中修改它不会修改磁盘上的文件,而是将受影响的4k页复制到实际内存中并在那里进行修改。)

    但是,您可以在文件仍在使用时重命名该文件(或移动它,只要它位于同一卷上,从技术上讲,这也是重命名操作)。然后,您可以用原始名称创建一个新文件,然后在所有地方卸载旧文件后删除它。

    也可以使用将旧文件标记为下次重新启动时自动删除 MoveFileEx(MOVEFILE_DELAY_UNTIL_REBOOT) 但这需要更高的特权。非提升的更新程序/卸载程序通常会选择将批处理或vbs文件放到本地appdata文件夹中,删除该文件,然后删除该文件本身(这将导致 工作是因为脚本 复制到内存)并在每个用户中注册它 RunOnce 注册表项。

    (请注意,使用 FILE_FLAG_DELETE_ON_CLOSE