我有一个实用程序,可以通过简单地复制/替换可执行文件来更新应用程序。现在,我有一些需要更新的DLL文件。然而,有时Windows不允许我替换它,因为有程序正在使用它,有时会有很多程序使用这个DLL,所以我不能保证它会被解锁,让我替换它。
目前,我唯一的解决办法是先重新命名现有的DLL,然后我才能将新的DLL复制到其位置。但是旧的DLL会被留在那里,并带有已更改的文件名。
在这种情况下,我该如何以编程方式替换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++程序来代替此操作。
Windows
单元已经包含了相关声明,因为API调用通常被使用,所以它通常会默认或设计地包含在大多数应用程序中。 - Ken White