在Inno Setup中加载具有依赖项的DLL在带有“无法导入DLL”的卸载程序中失败,但在安装程序中有效

康斯坦丁

卸载程序时出现此错误:

无法导入dll:<utf8> 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;
马丁·普里克里(Martin Prikryl)

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

正确的代码是imo:

[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标志您需要它来加载依赖项(sqlite3.dll)。
  • 您需要将依赖项(sqlite3.dll安装到上{app},以供卸载程序使用。
  • 安装的依赖项副本必须与主DLL查找的名称(sqlite3.dll,不是sqlite3x86.dll匹配
  • 在这些DLL的名称external声明有相匹配的目标文件名(DestName: IsStart.dllDestName: sqlite3.dll),而不是原来的一个。
  • 仅当从安装程序(带有files:前缀)中加载DLL时,依赖关系必须并且可以在声明中列出从物理路径({app}\IsStart.dll加载DLL时不可以列出依赖项的唯一目的是让安装程序提取它(它不会加载它,主DLL会加载它,因此是上一点)。加载物理文件时,无需列出它,因为已经(必须)安装了所有文件。如果使用{app}\primary.dll,{app}\dependency.dll,则卸载程序实际上将尝试加载具有名称的文件{app}\primary.dll,{app}\dependency.dll-显然失败。
  • 有没有安装任何东西到一点{tmp}也没有{src}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章