我需要在不重新启动应用程序的情况下替换我的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!');
答案 0 :(得分:4)
首先,让我们澄清一个非常常见的错误。你写道:
if hDLL < 32 then
这是不如何在加载DLL时测试失败。正如在LoadLibrary
的文档中非常清楚地说明的那样,失败由NULL
的返回值表示,其在Delphi术语中为0
。所以你应该用以下代码替换该测试:
if hDLL = 0 then
除此之外,只要对LoadLibrary
的每次调用都与对FreeLibrary
的匹配调用配对,就可以删除该文件。
所以,其他东西阻止你删除它。例如,可能是:
请注意,此列表并非详尽无遗。
你现在需要做一些调试。您遇到的情况是DeleteFile
的呼叫失败。所以,问问系统为什么。
if not DeleteFile('MyLib.dll') then
LogError(Format('Can''t delete MyLib.dll, error code = %d', [GetLastError]));