德尔菲7.如何在不重新启动应用程序的情况下卸载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!');

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

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]));

相关内容

最新更新