在 Inno Setup 中加载具有依赖项的 DLL 在卸载程序中失败并显示“无法导入 DLL”,但在安装程序中可以正常工作

2023-12-05

当我卸载该程序时,出现此错误:

无法导入 dll:c:\TestProg\IsStart.dll

我在这里做错了什么?有人能帮我解决这个问题吗?

CheckO4TaskMngrSvcStopAndUninstall停止并删除O4TaskManager Service:

这是代码:

[Files]
Source: "IsStartServer.dll"; DestDir: "{tmp}"; DestName: IsStart.dll
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{src}"; DestName: sqlite3.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
Source: "sqlite3x64.dll"; DestDir: "{app}"

[Code]
function TaskMngrInst: LongBool;                                                
external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';

function TaskMngrUninst: LongBool;                                                
external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall uninstallonly';

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
    begin
      TaskMngrInst();
    end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    begin
      TaskMngrUninst();
      DeleteFile(ExpandConstant('{app}\sqlite3.dll'));
      DeleteFile(ExpandConstant('{app}\IsStart.dll'));
      RenameFile('{app}\sqlite3x64.dll)', '{app}\sqlite3.dll');
    end;
end;

我相信存在一系列不同的问题(其中一些确实是基于我的错误建议)。

我认为正确的代码是:

[Files]
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
[Code]
function TaskMngrInst: LongBool;                                                
  external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';

function TaskMngrUninst: LongBool;                                                
  external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall loadwithalteredsearchpath uninstallonly';

要点:

  • 你原来的问题是缺乏loadwithalteredsearchpath flag在卸载程序的导入声明中。您需要它来加载依赖项(sqlite3.dll).
  • 您需要安装依赖项(sqlite3.dll)到{app}供卸载程序使用。
  • 已安装的依赖项副本必须与主 DLL 查找的名称匹配(sqlite3.dll, not sqlite3x86.dll).
  • DLL 中的名称external声明必须与目标文件名匹配(DestName: IsStart.dll, DestName: sqlite3.dll),不是原来的。
  • 仅当从安装程序中加载 DLL 时(使用files:字首)。从物理路径加载 DLL 时不会({app}\IsStart.dll)。列出依赖项的唯一目的是让安装程序提取它(安装程序不会加载它,而是主 DLL 会加载它,因此是上一点)。加载物理文件时,您不需要列出它,因为所有文件都(必须)已经安装。如果你使用{app}\primary.dll,{app}\dependency.dll,卸载程序实际上会尝试加载具有名称的文件{app}\primary.dll,{app}\dependency.dll– 显然失败了。
  • 安装任何东西都没有意义{tmp} nor {src}.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Inno Setup 中加载具有依赖项的 DLL 在卸载程序中失败并显示“无法导入 DLL”,但在安装程序中可以正常工作 的相关文章

随机推荐