如何复制/替换一个DLL文件?

8
我有一个实用程序,可以通过简单地复制/替换可执行文件来更新应用程序。现在,我有一些需要更新的DLL文件。然而,有时Windows不允许我替换它,因为有程序正在使用它,有时会有很多程序使用这个DLL,所以我不能保证它会被解锁,让我替换它。

目前,我唯一的解决办法是先重新命名现有的DLL,然后我才能将新的DLL复制到其位置。但是旧的DLL会被留在那里,并带有已更改的文件名。

在这种情况下,我该如何以编程方式替换DLL?


1
你是否使用过进程资源管理器来验证 DLL 文件被“锁定”的情况? - Neil
1
这个链接可能会有用:http://stackoverflow.com/q/5425905/62576。 - Ken White
2
一旦没有进程加载了DLL,你就可以覆盖它。你理解错了那部分。 - David Heffernan
@DavidHeffernan 奇怪,因为我一直有这个问题。 - Jerry Dodge
我修改了我的问题以考虑到这一点。我没有明确提到Indy,因为我不仅在这个问题上遇到了它。我正在寻求一个解决方案,可以适用于任何具有这种情况的DLL。 - Jerry Dodge
显示剩余8条评论
1个回答

14

你的方法没问题 - 只需更改文件名并将新的 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++程序来代替此操作。


3
这篇文章可能有助于解决Delphi组件的问题。Windows单元已经包含了相关声明,因为API调用通常被使用,所以它通常会默认或设计地包含在大多数应用程序中。 - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接