gpt4 book ai didi

c++ - Inno 安装程序 : Put DLLs in a subdirectory

转载 作者:可可西里 更新时间:2023-11-01 10:34:24 24 4
gpt4 key购买 nike

我想将依赖项(几个 DLL 文件)复制到一个单独的子目录中。安装我的程序后,目录结构如下所示:

  • 动态链接库/
    • 一个.dll
    • b.dll
  • sample /
  • pg.exe

我脚本的相关部分如下:

[Dirs]
Name: "{app}\sample"
Name: "{app}\dll"
[Files]
Source: "pg.exe"; DestDir: "{app}"; Flags: ignoreversion
; icon file
;Source: "pg.ico"; DestDir: "{app}"
; sample ini and geoemtry file
Source: "geometry.xml"; DestDir: "{app}\sample"
Source: "ini.xml"; DestDir: "{app}\sample"

; DLL
Source: "a.DLL"; DestDir: "{app}\dll"; Flags: onlyifdoesntexist
Source: "b.DLL"; DestDir: "{app}\dll"; Flags: onlyifdoesntexist

当我在 VM 中测试我的安装程序时,我收到一条错误消息,提示未找到 a.DLL。如果我只是将 a.DLLdll/ 复制到可执行文件的目录,问题很快就解决了。

  • 是否有必要将所有 dll 与可执行文件放在同一级别?
  • 或者有没有办法让可执行文件在子目录 dll/中找到它的依赖项?

最佳答案

如果你使用的是隐式DLL链接,那么只有几个目录您可以在其中放置必要的 DLL 文件。假设 SafeDllSearchMode 处于打开状态(这是自 Window XP SP2 以来的默认设置),Windows 加载程序将按以下顺序搜索 DLL:

  1. 你的可执行文件所在的目录
  2. Windows 目录
  3. Windows 系统目录
  4. 当前工作目录
  5. PATH 环境变量中列出的目录

有关搜索顺序的更多信息,请参阅 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

如果您使用这种类型的链接,我建议您将 DLL 放在与您的可执行文件相同的目录。

另一方面,如果您使用 LoadLibrary 显式链接到这些 DLL 或LoadLibraryEx API,您可以执行以下操作:

  1. 您可以调用 AddDllDirectory 并将包含您的目录的路径传递给它DLL。确保在加载库之前调用此函数,并确保使用带有标志 LOAD_LIBRARY_SEARCH_USER_DIRSLoadLibraryEx 加载库。
  2. 您可以使用 GetModuleFileName 函数检索可执行文件的路径,然后使用它构造 DLL 的绝对路径,并在调用 LoadLibrary(Ex) 时使用这些路径。
  3. 您可以在调用 LoadLibrary(Ex) 之前调用 SetDllDirectory。这个问题方法是每次调用SetDllDirectory函数时,替换目录在前面的 SetDllDirectory 调用中指定。如果您不小心,这可能会导致问题因为代码的其他部分可能会调用 SetDllDirectory 并在加载 DLL 时导致失败

关于c++ - Inno 安装程序 : Put DLLs in a subdirectory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35310755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com