我希望将依赖项(几个DLL文件)复制到一个单独的子目录中。安装我的程序后,目录结构如下所示:
我的脚本的相关部分如下:
[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.DLL
从dll/
复制到可执行文件的目录中,问题就会很快得到解决。
答案 0 :(得分:1)
如果使用隐式DLL链接,则只有几个目录
您可以在哪里放置必要的DLL文件。假设SafeDllSearchMode
已启用(这是自Window XP SP2以来的默认设置),Windows加载程序将按以下顺序搜索DLL:
有关搜索顺序的详细信息,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
如果您使用这种类型的链接,我建议您将DLL放入 与可执行文件相同的目录。
另一方面,如果您使用LoadLibrary
或显式链接到这些DLL
LoadLibraryEx
API,您可以执行以下操作:
AddDllDirectory
并将其传递给包含您的目录的路径
DLL文件。确保在加载库之前调用此函数,并确保您
使用带有标记LoadLibraryEx
的{{1}}加载库。LOAD_LIBRARY_SEARCH_USER_DIRS
函数检索可执行文件的路径
用它来构造DLL的绝对路径,并在调用GetModuleFileName
时使用这些路径。LoadLibrary(Ex)
之前致电SetDllDirectory
。这个问题
方法是每次调用LoadLibrary(Ex)
函数时,它都会替换目录
在之前的SetDllDirectory
电话中指定。如果你不小心,这可能会导致问题
因为代码的某些其他部分可能会调用SetDllDirectory
并在加载DLL时导致失败