10

我的基本问题是:我的程序(MyProgram.exe)依赖于另一个程序(OtherProgram)的 DLL,我试图避免每次 OtherProgram 更新时重新打包一个新的 DLL。我想在 MyProgram.exe 启动时在 OtherProgram 的 DLL 中有链接,但我不完全确定 Windows 是否允许这样做。因此,如果有某种解决方法也是可以接受的。

只是为了一些背景,平台是 Windows 7 x64,当我在 MyProgram.exe 项目目录中创建指向 OtherProgram 安装目录中 DLL 的符号链接时,MyProgram.exe 运行良好。当我尝试在没有符号链接的情况下运行它时,出现“程序无法启动,因为您的计算机中缺少 OtherProgramDLL.dll”错误。

非常感谢任何建议或相关信息的链接!

编辑:澄清:DLL在编译时没有链接,这个问题在运行时出现

4

6 回答 6

12

Windows 世界中有两种类型的动态链接:

  1. 加载时链接是在程序启动时自动加载 DLL。Windows 使用我将在下面讨论的特定算法找到此 DLL。
  2. 运行时链接是指通过调用LoadLibrary代码来专门加载 DLL 。类似的规则适用于如何找到库,但您可以指定完全限定或相对限定的路径来控制搜索。

在加载时链接的情况下,MS 建议将程序的 DLL 存储在加载应用程序的同一目录中并从该目录加载。如果这完全可行,这可能是您最好的选择。

如果这不起作用,还有其他几个选项,在此处列出。一种是通过将 DLL 放在工作目录或从中加载应用程序的目录中来利用搜索顺序。

您可以通过以下方式更改应用程序的工作目录:

  1. 创建应用程序的快捷方式。
  2. 调出快捷方式的属性
  3. 使用 DLL 所在的目录编辑“开始于”属性。

当您使用快捷方式启动应用程序时,它将加载正确的 DLL。

加载时链接的其他选项包括:

  • 向您的应用程序添加一个清单,该清单指定您的依赖程序集在哪里,或者,
  • 设置PATH.
于 2012-05-15T19:16:36.480 回答
3

您可以使用LoadLibrary,但您需要一种方法来保证 DLL 的位置。这篇 Wikipedia文章提供了关于如何在加载 DLL 后使用它的很好的示例。

于 2012-05-15T18:10:40.227 回答
1

您可以将dll所在的目录添加到PATH环境变量中。

于 2012-05-15T18:03:21.440 回答
1

LoadLibrary我一直在为同样的问题而苦苦挣扎,并且还发现了建议的方法,如、SetDllDirectory、 QtaddLibraryPath和其他方法的死胡同。不管我尝试了什么,问题仍然存在,即应用程序在实际运行代码之前检查了库(并且没有找到它们),因此任何代码解决方案都必然会失败。

我几乎绝望了,但后来发现了一种非常简单的方法,在像你这样的情况下也可能会有所帮助:使用批处理文件!(或实际应用之前的类似加载器)

用于此目的的 Windows 批处理文件可能如下所示:

@echo off
PATH=%PATH%;<PATH_TO_YOUR_LIB>
<PATH_TO_YOUR_APP_EXE>

/edit:刚刚在Luchian 的回答中看到了@SirDarius评论,它描述了这种方式,所以只需将我的批处理代码位作为参考,所有学分都归他所有。

于 2015-06-15T15:10:00.067 回答
1

我正在处理的一个应用程序也有同样的问题。

我不想使用运行时加载,因为我需要手动为其创建函数指针的函数有几十个。

Dibling 先生提到清单文件为我打开了一扇新的大门,但我遗憾地发现支持该功能的最旧版本的 Windows 是 Windows 7。它甚至无法在 Vista 上运行。

长话短说,一位熟悉 Windows 应用程序开发的朋友告诉我查找Delay-Loaded DLL,结果证明以最小的努力完美地解决了问题。它将 DLL 库的加载延迟到您手动执行的点,或者第一次调用它的函数时。因此,您只需在此之前将您的 DLL 路径添加到搜索路径,SetDllDirectory可以帮助您。

以下是使其工作的步骤:

1) 指定要延迟加载到链接器的 DLL,可以通过您的 makefile、cmake 或 VS 属性页 (Linker->Input of VS2015)

2) 在程序开始时调用SetDllDirectory,在调用 DLL 之前。

一直到 VC6 都支持延迟加载的 DLL。XP SP1 之后支持SetDllDirectory。

于 2017-10-01T01:38:41.287 回答
0

使用指向第 3 方可执行文件的符号链接

我发现Aaron Margosis提倡的方法很有用。看:

使用 NTFS 连接修复 64 位版本 Windows 上的应用程序兼容性问题

本质上,为每个相关的第 3 方可执行文件创建符号链接。将这些符号链接文件放在您自己的相关可执行文件中。除了对目标的文件名更改外,“软”符号链接将解决加载时依赖关系,即使链接的目标被未来的更新更改。

于 2017-04-06T21:17:25.373 回答