Inno Setup:将DLL放在子目录中

时间:2016-02-10 09:04:56

标签: c++ windows dll inno-setup

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

  • 的DLL /
    • A.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 /?
  • 中找到它的依赖项

1 个答案:

答案 0 :(得分:1)

如果使用隐式DLL链接,则只有几个目录 您可以在哪里放置必要的DLL文件。假设SafeDllSearchMode已启用(这是自Window XP SP2以来的默认设置),Windows加载程序将按以下顺序搜索DLL:

  1. 您的可执行文件所在的目录
  2. Windows目录
  3. Windows系统目录
  4. 当前工作目录
  5. PATH环境变量中列出的目录
  6. 有关搜索顺序的详细信息,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

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

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

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