在Inno安装程序中加载带有依赖项的DLL在卸载程序中失败;无法导入DLL";,但在安装程序中工作

在Inno安装程序中加载带有依赖项的DLL在卸载程序中失败;无法导入DLL";,但在安装程序中工作,dll,import,inno-setup,uninstallation,pascalscript,Dll,Import,Inno Setup,Uninstallation,Pascalscript,当我卸载该程序时,出现以下错误: 无法导入dll:c:\TestProg\IsStart.dll 我做错了什么?有人能帮我解决这个问题吗 选中O4taskmngrsvcstop并卸载停止并删除O4TaskManager服务: 代码如下: [文件] 来源:“IsStartServer.dll”;DestDir:“{tmp}”;DestName:IsStart.dll 来源:“IsStartServer.dll”;DestDir:“{app}”;DestName:IsStart.dll 来源:“sq

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

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

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

选中O4taskmngrsvcstop并卸载
停止并删除
O4TaskManager服务

代码如下:

[文件]
来源:“IsStartServer.dll”;DestDir:“{tmp}”;DestName:IsStart.dll
来源:“IsStartServer.dll”;DestDir:“{app}”;DestName:IsStart.dll
来源:“sqlite3x86.dll”;DestDir:“{src}”;DestName:sqlite3.dll
来源:“sqlite3x86.dll”;DestDir:“{app}”;DestName:sqlite3.dll
来源:“sqlite3x64.dll”;DestDir:“{app}”
[守则]
功能任务MNGRINST:LongBool;
外部的CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';
函数TaskMngrUninst:LongBool;
外部“checko4taskmngrsvcstop和uninstall@{app}\IsStart.dll stdcall uninstall only”;
过程CurStepChanged(CurStep:TSetupStep);
开始
如果CurStep=ssInstall,则
开始
TaskMngrInst();
结束;
结束;
过程CurUninstallStep已更改(CurUninstallStep:TUninstallStep);
开始
如果CurUninstallStep=usUninstall,则
开始
TaskMngrUninst();
DeleteFile(ExpandConstant({app}\sqlite3.dll');
DeleteFile(ExpandConstant({app}\IsStart.dll');
重命名文件(“{app}\sqlite3x64.dll)”,“{app}\sqlite3.dll”);
结束;
结束;

IsStart.dll是否依赖于sqlite3.dll?可能是因为它不知道什么是sqlite3x86.dll。在带有插件的totalcmd中,您可以查看丢失的dll

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

正确的代码是,国际海事组织:

[Files]
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
[代码]
功能任务MNGRINST:LongBool;
外部的CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';
函数TaskMngrUninst:LongBool;
外部“checko4taskmngrsvcstop和uninstall@{app}\IsStart.dll stdcall loadwithalteredsearchpath uninstallonly”;
要点:

  • 您最初的问题是卸载程序的导入声明中缺少。您需要它来加载依赖项(
    sqlite3.dll
  • 您需要将依赖项(
    sqlite3.dll
    )安装到
    {app}
    以供卸载程序使用
  • 依赖项的已安装副本必须与主DLL查找的名称匹配(
    sqlite3.DLL
    ,而不是
    sqlite3x86.DLL
  • 外部
    声明中dll的名称必须与目标文件名(
    DestName:IsStart.dll
    DestName:sqlite3.dll
    )匹配,而不是与原始文件名匹配
  • 仅当从安装程序中加载DLL时(使用
    文件:
    前缀),该依赖项才能在声明中列出。从物理路径(
    {app}\IsStart.DLL
    )加载DLL时不是这样。列出依赖项的唯一目的是让安装程序提取它(它不加载它,主DLL加载它,因此前一点)。加载物理文件时,不需要列出它,因为所有文件都已安装(必须安装)。如果使用
    {app}\primary.dll、{app}\dependency.dll
    ,卸载程序将实际尝试加载名为
    {app}\primary.dll、{app}\dependency.dll
    的文件-显然失败
  • {tmp}
    {src}
    上安装任何东西都没有意义

我已经更改了代码,现在一切都正常了,但事实并非如此。我只是无法在卸载程序中使用具有依赖项的DLL。