Delphi7中。如何在没有app重启的情况下卸载dll?

时间:2017-11-07 08:51:10

标签: delphi dll

我需要在不重新启动应用程序的情况下替换我的dll,但在FreeLibrary之后仍然使用它并且无法删除。

请帮忙。

//...
function MyFunc(): PChar; stdcall; external 'MyDll.dll';

implementation

//...

hDLL := LoadLibrary('MyLib.dll');
if hDLL = 0 then
  Begin
    LogError('Can''t load MyLib.dll!');
    exit;
  end;

try
  MyFunc();
finally
  FreeLibrary(hDLL);
end;

if not DeleteFile('MyLib.dll') then
  LogError('Can''t delete MyLib.dll!');

1 个答案:

答案 0 :(得分:4)

首先,让我们澄清一个非常常见的错误。你写道:

if hDLL < 32 then

这是如何在加载DLL时测试失败。正如在LoadLibrary的文档中非常清楚地说明的那样,失败由NULL的返回值表示,其在Delphi术语中为0。所以你应该用以下代码替换该测试:

if hDLL = 0 then

除此之外,只要对LoadLibrary的每次调用都与对FreeLibrary的匹配调用配对,就可以删除该文件。

所以,其他东西阻止你删除它。例如,可能是:

  • DLL位于您的用户无权删除它的目录中。
  • 另一个进程已加载DLL。
  • 您的进程已通过其他方式加载DLL,因此仍然保留对它的引用。
  • DLL不在当前工作目录中。因为您使用了相对路径,所以在加载DLL时会使用DLL搜索路径,但在尝试删除它时会使用工作目录。这些可能不一致。

请注意,此列表并非详尽无遗。

你现在需要做一些调试。您遇到的情况是DeleteFile的呼叫失败。所以,问问系统为什么。

if not DeleteFile('MyLib.dll') then
  LogError(Format('Can''t delete MyLib.dll, error code = %d', [GetLastError]));