我有一个实用程序,它通过简单地复制/替换可执行文件来更新应用程序。现在,我有一些 DLL 文件也需要更新。但是,有时 Windows 不会让我替换它,因为某些东西正在使用它,有时使用 DLL 的东西太多,我不能保证它会被我解锁来替换它。
目前,我唯一的解决方法是先重命名现有的 DLL,然后我可以复制新的 DLL。但是,旧的 DLL 会留下一个更改的文件名。
在这种情况下,如何以编程方式替换 DLL?
我有一个实用程序,它通过简单地复制/替换可执行文件来更新应用程序。现在,我有一些 DLL 文件也需要更新。但是,有时 Windows 不会让我替换它,因为某些东西正在使用它,有时使用 DLL 的东西太多,我不能保证它会被我解锁来替换它。
目前,我唯一的解决方法是先重命名现有的 DLL,然后我可以复制新的 DLL。但是,旧的 DLL 会留下一个更改的文件名。
在这种情况下,如何以编程方式替换 DLL?
您的方法很好 - 只需重命名文件并将新的 DLL 复制到正确的位置。完成后,您可以使用 Windows API 函数MoveFileEx注册旧文件,以便下次重新启动机器时删除。从 MSDN 文档:
如果 dwFlags 指定 MOVEFILE_DELAY_UNTIL_REBOOT 并且 lpNewFileName 为 NULL,则 MoveFileEx 注册 lpExistingFileName 文件,以便在系统重新启动时删除。如果 lpExistingFileName 引用一个目录,则系统仅在目录为空时才会在重新启动时删除该目录。
所以你会想做这样的事情:
MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
我没有与 Delphi 合作太多。假设您可以导入正确的 Windows API 函数并直接从 Delphi 进行此调用,或者编写一个小的 C++ 程序,您可以调用它来为您处理这个问题。