【问题标题】:Inno Setup: Put DLLs in a subdirectoryInno Setup:将 DLL 放在子目录中
【发布时间】:2016-02-10 09:04:56
【问题描述】:

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

  • dll/
    • a.dll
    • b.dll
  • 样品/
  • 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 链接?
  • 我不知道。如何发现?
  • 在代码中使用LoadLibraryLoadLibraryEx实现显式链接,使用dllimport/dllexport语句实现隐式链接,并且DLL必须具有相应的导入库(.LIB)文件。有关详细信息,请参阅我的答案。

标签: c++ windows dll inno-setup


【解决方案1】:

如果您使用隐式 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 放在 与您的可执行文件相同的目录。

另一方面,如果您使用LoadLibraryLoadLibraryEx API,您可以这样做:

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

【讨论】:

  • 感谢您指出放置 dll 的位置。这有帮助。我有隐式链接。
  • 列表顺序采用SafeDllSearchMode = 0 (off),而自Windows XP SP2起默认为1 (on)
  • @MSalters 我的回答并没有表明这是确切的顺序,它只是说明了位置。但是,我会更新答案以避免混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2011-04-02
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2017-05-13
相关资源
最近更新 更多