c++ - 在程序启动时从另一个目录加载 DLL

标签 c++ windows visual-studio dll

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

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

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

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

最佳答案

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

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

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

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

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

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

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

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

  • 向您的应用程序添加 list ,指定您的依赖项 assemblies是,或者,
  • 设置路径

关于c++ - 在程序启动时从另一个目录加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606304/

相关文章:

c++ - 为 Ruby 使用 FFI 包装 C 函数

c++ - 如何隐藏 QFileSystemModel 中的特定目录

c++ - W8 服务的连接待机通知

c - 为什么 scanf 会用 0 覆盖之前读取的 unsigned char 变量?

asp.net - 重新编译asp.net网站时如何重新启动IIS站点

visual-studio - 在 F# 中调用另一个 dll 的类型提供程序

c++ - Arduino:将 uint64_t 转换为字符串

c++ - 在 C++ 中使用 NuGet 中的 libcurl (VS2013)

windows - Windows 上 Ruby 出现 SSL 错误

visual-studio - 'My"证书库去哪儿了?