【问题标题】:C++ Load DLL From a Subdirectory?C++ 从子目录加载 DLL?
【发布时间】:2013-06-29 12:25:28
【问题描述】:

我是 C++ 的“隐藏/黑暗的地方”的新手,我想知道如何从不同目录或当前可执行文件正在运行的目录中的子目录加载 .dll 文件

例如:

./MyAppDirectory
  /MyApp.exe
  /SomeDLL.dll
  /AnotherDLL.dll
  /SubDirectory
    /SomeDLL2.dll
    /AnotherDLL2.dll
    /YetAnotherDLL.dll
    /...

所以“MyApp.exe”会自动从它的根文件夹“MyAppDirectory”加载“SomeDLL.dll”和“AnotherDLL.dll”但是我也希望能够加载“SomeDLL2.dll”、“AnotherDLL2.dll”、 “MyAppDirectory”文件夹内的“SubDirectory”文件夹中的“YetAnotherDLL.dll”等。

我一直在做一些搜索,我发现唯一的解决方案是:

  • 1) 修改可执行文件的工作目录。
  • 2) 将 DLL 文件放入 Windows 根目录。
  • 3) 修改 PATH 环境变量。

但它们都有一些不好的方面(这里不值一提),这不是我真正需要的。另一个解决方案是通过“应用程序特定路径!”这涉及使用 Windows 注册表,似乎比前面提到的要好一些。

但是我需要能够使用 C++ 在“MyApp.exe”中执行此操作,而无需使用外部方法。

我使用的是 MinGW 4.7.2,我的 IDE 是 Code::Blocks 12.11,我的操作系统是 Windows XP SP3 Pro x86。

任何参考、教程、文档、示例等都被接受,感谢您的宝贵时间:D

【问题讨论】:

标签: c++ dll load directory external


【解决方案1】:

如果您没有显式加载 DLL(“手动”,在您的代码中使用 LoadLibrary(...)),那么您必须将 .dll 放在 Windows 将查找 DLL 的位置,这几乎意味着您在问题中谈论的三个选项。

使用LoadLibrary 时,您可以指定DLL 的相对或绝对路径。

注意,显式和隐式加载DLL是完全不同的——在显式情况下,你必须使用LoadLibrary,然后使用GetProcAddress来查找函数的地址,你必须使用函数调用函数的指针 - 这通常仅用于插件或类似功能,其中 DLL 提供少量函数(通常只是一个工厂函数,用于创建对象以执行具有通用接口类的操作,并且每个DLL 具有相同类型的函数来创建一个对象来做它应该做的任何事情)。

在隐式加载中,您无需在代码中执行任何操作即可使用 DLL,并且 DLL 中的函数看起来就像是硬链接到应用程序中一样。

【讨论】:

  • 非常感谢您回答我的问题的扩展答案:D
  • 抱歉错误。在进一步记录您的答案时,我被某人分心了,忘记确认了。
【解决方案2】:

你应该使用

LoadLibrary("subFolder\\dynamicLibrary.dll");

这是到 DLL 的显式链接,它比隐式链接要难一些(我认为这是您正在使用的),但我相信这是实现您的目的的正确方法

explicit

implicit

【讨论】:

  • 这个方法是 MSVC 特有的,还是我可以在 MinGW (gcc) 等其他编译器中使用它?
  • 它是一个WinAPI,所以你可以在每个编译器中使用,你只需要包含并链接Kernel32.lib 显然它只适用于Windows
  • 没有。您应该使用绝对路径。
  • 使用绝对路径,如果你的程序安装在你没想到的地方就中断?您将无法通过 Microsoft“为 Windows XP 设计”资格,更不用说较新的版本了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多