Inno setup:将 DLL 放在子目录中
Inno Setup: Put DLLs in a subdirectory
我想将依赖项(几个DLL文件(复制到一个单独的子目录中。安装我的程序后,目录结构如下所示:
- dlls/
- 答.dll
- 乙.dll
- 样本/
- 第.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.DLL
从dll/
复制到可执行文件的目录,问题很快就会得到解决。
- 是否有必要将所有 dll 放在与可执行文件相同的级别上?
- 或者有没有办法让可执行文件在子目录 dll/中找到它的依赖项?
如果您使用的是隐式 DLL 链接,则只有几个目录您可以在其中放置必要的 DLL 文件。假设SafeDllSearchMode
处于打开状态(这是自 Window XP SP2 以来的默认设置(,Windows 加载程序将按以下顺序搜索 DLL:
- 可执行文件所在的目录
- 视窗目录
- 视窗系统目录
- 当前工作目录
- PATH 环境变量中列出的目录
有关搜索顺序的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85(.aspx
如果您使用这种类型的链接,我建议您将 DLL 放在与可执行文件相同的目录。
另一方面,如果使用LoadLibrary
或显式链接到这些 DLL LoadLibraryEx
API 中,您可以执行以下操作:
- 您可以调用
AddDllDirectory
并向其传递包含请确保在加载库之前调用此函数,并确保使用带有标志LOAD_LIBRARY_SEARCH_USER_DIRS
的LoadLibraryEx
加载库。 - 您可以使用
GetModuleFileName
函数检索可执行文件的路径,然后使用它来构造 DLL 的绝对路径,并在调用LoadLibrary(Ex)
时使用这些路径。 - 您可以在呼叫
LoadLibrary(Ex)
之前呼叫SetDllDirectory
。这个问题来了方法是每次调用SetDllDirectory
函数时,它都会替换目录在上一个SetDllDirectory
调用中指定。如果您不小心,这可能会导致问题因为代码的其他部分可能会调用SetDllDirectory
并在加载 DLL 时导致失败
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- CLR dll 无法运行托管 DLL,除非它位于 exe 目录(或其子目录)内
- 如何在代码lite中将dll位置更改为子目录
- Inno setup:将 DLL 放在子目录中