我的软件 dll 补丁未在 Windows 10 上更新

我的软件 dll 补丁未在 Windows 10 上更新

我在 Windows 10 上有一个现有文件 (dll、.exe、.msi),我正尝试通过发送一些补丁来更新它们。但问题是,在更新过程中,如果任何文件正在使用,并且我尝试通过用新的更新文件替换它来更新该文件,Windows 会提示现有文件出现删除文件弹出窗口。如果我们选择是,它会显示已成功删除,但直到最后一个用户释放该文件时它才会被删除。此后,新的更新文件不会被替换到该位置。

编辑:发帖者在评论中指出他的问题与注册的 DLL 有关。

答案1

如何替换正在使用的 DLL?

动态链接库更新

有时需要用较新版本替换 DLL。在替换 DLL 之前,请执行版本检查,以确保用较新版本替换旧版本。可以替换正在使用的 DLL。替换正在使用的 DLL 的方法取决于您使用的操作系统。在 Windows XP 及更高版本上,应用程序应使用隔离应用程序和并行程序集

如果执行以下步骤,则无需重新启动计算机:

  • 使用MoveFileEx函数重命名要替换的 DLL。不要指定MOVEFILE_COPY_ALLOWED,并确保重命名的文件与原始文件位于同一卷上。您也可以通过为同一目录中的文件赋予不同的扩展名来重命名该文件。
  • 将新的 DLL 复制到包含重命名的 DLL 的目录。现在所有应用程序都将使用新的 DLL。
  • 使用MoveFileExwithMOVEFILE_DELAY_UNTIL_REBOOT删除重命名的 DLL。

在进行此替换之前,应用程序将使用原始 DLL,直到卸载为止。进行替换之后,应用程序将使用新的 DLL。编写 DLL 时,必须小心确保它已为这种情况做好准备,尤其是当 DLL 维护全局状态信息或与其他服务通信时。如果 DLL 没有为全局状态信息或通信协议的更改做好准备,则更新 DLL 将要求您重新启动计算机以确保所有应用程序都使用相同版本的 DLL。

来源动态链接库更新(Windows)


如何在 Windows 重启时替换正在使用的文件

本文介绍了另一种可用于替换 Windows 正在使用的文件的方法。此方法使用注册表在启动时替换文件,在文件被 Windows 访问之前。

以下步骤演示了如何使用%SystemRoot%\System32位于 C:\Temp 文件夹中的 Win32k.sys 文件替换文件夹中的 Win32k.sys 文件。如果您的 Windows 安装是可启动的,则可以使用此方法的变体替换任何文件。

  1. 启动注册表编辑器 (Regedt32.exe)。
  2. 在 Windows 注册表中找到以下项:
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
  3. 使用以下信息创建新值:
    • 值名称:PendingFileRenameOperations
    • 数据类型 :REG_MULTI_SZ
    • 值数据:\??\c:\temp\win32k.sys !\??\c:\winnt\system32\win32k.sys
    • 请注意,值数据是在两行不同的行上输入的。
  4. 退出注册表编辑器。
  5. 重新启动计算机。

来源如何在 Windows 重启时替换正在使用的文件

答案2

替换 DLL 的正确方法是:

  • 重命名 DLL 文件
  • 将新的 DLL 文件存储到正确的名称下
  • 当重命名的文件不再使用时,它将被删除。

对于已注册的 DLL,您必须就地取消注册并注册新版本。取消注册过程(使用安装程序完成时)将检测正在使用的 DLL 并警告您需要重新启动。此外,这也意味着在您复制新文件或注册新文件时无法加载 DLL(一旦取消注册)。

因此,你应该将补丁作为安装程序分发。例如,你可以使用免费的 创新设置。上次我使用它时,您需要设置要安装的 DLL 的属性才能进行注册和重新注册。然后该过程将自动进行,您无需进行任何特殊编程。

如果您无法将补丁作为安装程序分发,则应将其设置为启动时运行一次并要求重新启动。有关更多信息,请参阅文章 启动 Windows 时仅运行一次程序,这需要一些注册工作。

相关内容