gpt4 book ai didi

德尔福7.如何在不重新启动应用程序的情况下卸载dll?

转载 作者:行者123 更新时间:2023-12-01 22:10:25 25 4
gpt4 key购买 nike

我需要在不重新启动应用程序的情况下替换我的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]));

关于德尔福7.如何在不重新启动应用程序的情况下卸载dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47153533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com