在 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”,但在安装程序中可以正常工作 的相关文章

  • 如何在 Inno Setup 中静默安装 Microsoft VC++ 可再发行组件?

    如何在 Inno Setup 中静默安装 Microsoft VC 可再发行组件 我使用了以下代码 除了安装进度窗口之外 大部分安装部分都是静默的 这是我的 Run 部分代码 Run Filename app bin vcredist x8
  • 如何将 C++ 类包装在基于 C 的 dll 或基于 CLI 的 dll 中?

    我被告知将我用 C 编写的类导入到 dll 中 然后在 c 应用程序中使用该 dll 下列的本指南 https stackoverflow com questions 4555961 how to use a class in dll我创建
  • 使用 Python-VLC 的 PyInstaller:无属性“media_player_new”错误

    我使用 Python VLC 创建视频播放器 并使用 PyInstaller 在 Windows 10 计算机上生成可执行文件 最初 它给了我错误 Import Error Failed to load dynlib dll libvlc
  • 在 iOS Cocoa 静态库项目中使用 Objective-C 代码,在 iOS 应用程序项目中使用 Swift 代码

    我正在寻找一个简单的过程 用于将共享库项目中的 Objective C 代码与应用程序项目中的 Swift 代码相结合 但到目前为止 此序列尚未成功 启动Xcode 6 1 1 创建工作区测试 创建iOS Cocoa Touch静态库项目T
  • 从命令行运行本机 VS2012/C++ 64 位单元测试

    我正在尝试从命令行运行单元测试 我尝试使用以下命令使用 mstest exe 程序 E VS Projects gt C Program Files x86 Microsoft Visual Studio 11 0 Common7 IDE
  • 如何在Electron App中调用C# dll方法?

    我有一个电子应用程序 可以从读卡器读取信用卡详细信息 他们提供了一个 c dll 来与应用程序交互 我不知道如何从电子应用程序读取 dll 方法 首先使用以下命令检查 dll 中公开的函数依赖步行者 http www dependencyw
  • 如何轻松地将多个sql文件导入MySQL数据库?

    我有一些sql文件 我想要import将它们全部一次性存入 MySQL 数据库 I go to PHPMyAdmin 访问数据库 点击import 选择一个文件并导入 当我有多个文件时 需要很长时间 我想知道是否有更好的方法来导入多个文件
  • 如何使用 C# 和 .NET 中的 C++ 库?

    我的问题与 DLL 如何导出 C 类和泛型方法 关于没有 C 并行的 C 语言功能 密切相关 我相信你可以在extern C 只需引用 DLL 并使用 DLLImport 即可从 C 中阻止 但是您可以实例化模板化的 C 类型吗 如果 C
  • 在 Visual Studio 中引用同一解决方案中的项目

    我有一个包含两个项目的解决方案 其中一个项目是一个带有 DLL 文件的库 我希望能够在其他项目中引用该项目库以使用其类 我的最终目标是做到这一点 同时仍然可以访问库源代码 我尝试过引用 dll 也尝试过引用 csproj 这两种情况都有效
  • 将 Scala 文件转换为 Dll

    我有一些使用 IntelliJ 和 SBT Plugin 编写的 scala 代码 并希望将代码作为 C 的 DLL 提供给我 我已经尝试使用 ikvmc 我通过 package 将所有类打包在一个罐子中 之后 我手动设置一个 jar 其中
  • Rust:根目录中没有“模块”

    当我跑步时use crate feed in src cmdline rs我希望导入src feed rs 但事实并非如此 相反我得到 error E0432 unresolved import crate feed gt src cmdl
  • 无法加载 DLL(找不到模块 HRESULT:0x8007007E)

    我有一个 dll 库 其中包含我需要在 NET 4 0 应用程序中使用的非托管 C API 代码 但我尝试加载 dll 的每种方法都会出现错误 无法加载 DLL MyOwn dll 找不到指定的模块 HRESULT 异常 0x8007007
  • 如何在“PrepareToInstall”期间显示进度?

    我正在开发的安装程序的大部分工作是在PrepareToInstall功能 因为我需要做的一切都可能失败 因此这是处理这些事情的适当位置 以防它们失败 通过在函数结果中传递错误消息 可以自动报告任何失败 安装程序实际复制的只有 3 个小文件
  • 使用 ff 包导入文本文件

    我有一个包含 450 万行和 90 列的文本文件要导入到 R 中 read table我得到了cannot allocate vector of size 错误消息 因此我尝试使用 ff 包导入 然后再对数据进行子集化以提取我感兴趣的观察结
  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”

    据我了解 此类错误已在 SO 上讨论过多次 有些人认为这是 DLL 文件中的错误 有些人通过更改 DLL 版本来解决 其他人似乎没有任何线索 无论如何 我只是发帖试试运气 在 C GUI 上的网格中选择一行时 我的应用程序崩溃了 stack
  • 将 Python 脚本导入另一个脚本?

    我正在阅读 Zed Shaw 的 艰难学习 Python 正在学习第 26 课 在本课中 我们必须修复一些代码 这些代码从另一个脚本调用函数 他说我们不必导入它们来通过测试 但我很好奇我们将如何做到这一点 课程链接 http learnpy
  • 为什么某些 dll 静态链接存根库(导入库)如此大?

    我在链接到 pcl 点云库 时注意到 一些 dll 存根库的大小超过 10MB 而 dll 本身的大小还不到该大小的一半 这些是发布版本 难道存根库不应该只包含最少的信息以便可以访问 dll 信息吗 怎么会比他们引用的dll文件大呢 对我来
  • Java导入语句语法

    这是一个简单的问题 但我真的很困惑 我试图找到一个重复的 并用谷歌搜索 但当我找不到令人满意的答案时 我感到更惊讶 import java util Scanner 在这份声明中 Scanner是班级 util是包的名称 What is j
  • 我需要从 64 位 exe 访问 32 位 dll

    我知道我阅读了有关代理进程的所有内容 并且我能够创建代理 COM 但它要么全部在 32 位中工作 要么全部在 64 位中工作 正确的结构是什么 1 32 dll 我尝试了以上两种方法 但没有成功调用32 dll 我不太了解您所指的代理 CO

随机推荐